1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include "client.h"
#include "chatroom.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
#define PORT 6667
#define MAX_CLIENTS 10
client_t *clients[MAX_CLIENTS] = {0};
pthread_mutex_t clients_mutex = PTHREAD_MUTEX_INITIALIZER;
int main() {
int server_sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr = {
.sin_family = AF_INET,
.sin_addr.s_addr = INADDR_ANY,
.sin_port = htons(PORT)
};
bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_sock, MAX_CLIENTS);
load_chatrooms("chatrooms.txt");
printf("Server listening on port %d...\n", PORT);
while (1) {
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &len);
client_t *cli = malloc(sizeof(client_t));
cli->socket = client_sock;
cli->address = client_addr;
strcpy(cli->username, "anonymous");
strcpy(cli->room, "");
pthread_mutex_lock(&clients_mutex);
for (int i = 0; i < MAX_CLIENTS; i++) {
if (!clients[i]) {
clients[i] = cli;
pthread_t tid;
pthread_create(&tid, NULL, handle_client, cli);
pthread_detach(tid);
break;
}
}
pthread_mutex_unlock(&clients_mutex);
}
close(server_sock);
return 0;
}
|