#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
#define PORT 8888
#define MAX_MESSAGE_SIZE 1024
#define MAX_CLIENTS 10
typedef
struct
{
struct
sockaddr_in address;
int
socket;
int
id;
} Client;
Client clients[MAX_CLIENTS];
pthread_t threads[MAX_CLIENTS];
int
clientCount = 0;
pthread_mutex_t mutex;
void
*handleClient(
void
*arg) {
int
id = *((
int
*)arg);
char
buffer[MAX_MESSAGE_SIZE];
ssize_t bytesRead;
while
(1) {
bytesRead = recvfrom(clients[id].socket, buffer,
sizeof
(buffer), 0, NULL, NULL);
if
(bytesRead == -1) {
perror
(
"Receive failed"
);
exit
(EXIT_FAILURE);
}
buffer[bytesRead] =
'\0'
;
printf
(
"Client %d: %s"
, id + 1, buffer);
pthread_mutex_lock(&mutex);
for
(
int
i = 0; i < clientCount; ++i) {
if
(i != id) {
sendto(clients[i].socket, buffer, bytesRead, 0, (
struct
sockaddr*)&clients[i].address,
sizeof
(clients[i].address));
}
}
pthread_mutex_unlock(&mutex);
sprintf
(buffer,
"Server: Message from server to Client %d\n"
, id + 1);
sendto(clients[id].socket, buffer,
strlen
(buffer), 0, (
struct
sockaddr*)&clients[id].address,
sizeof
(clients[id].address));
}
}
int
main() {
int
serverSocket;
struct
sockaddr_in serverAddr;
char
buffer[MAX_MESSAGE_SIZE];
socklen_t clientLen =
sizeof
(
struct
sockaddr_in);
ssize_t bytesRead;
if
((serverSocket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror
(
"Socket creation failed"
);
exit
(EXIT_FAILURE);
}
memset
(&serverAddr, 0,
sizeof
(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
if
(bind(serverSocket, (
struct
sockaddr*)&serverAddr,
sizeof
(serverAddr)) == -1) {
perror
(
"Bind failed"
);
exit
(EXIT_FAILURE);
}
pthread_mutex_init(&mutex, NULL);
printf
(
"Server listening on port %d...\n"
, PORT);
while
(1) {
bytesRead = recvfrom(serverSocket, buffer,
sizeof
(buffer), 0, (
struct
sockaddr*)&clients[clientCount].address, &clientLen);
if
(bytesRead == -1) {
perror
(
"Receive failed"
);
exit
(EXIT_FAILURE);
}
buffer[bytesRead] =
'\0'
;
printf
(
"Client %d connected: %s"
, clientCount + 1, buffer);
clients[clientCount].socket = serverSocket;
clients[clientCount].id = clientCount;
pthread_create(&threads[clientCount], NULL, handleClient, (
void
*)&clients[clientCount].id);
clientCount++;
sprintf
(buffer,
"Server: Welcome, you are Client %d\n"
, clientCount);
sendto(clients[clientCount - 1].socket, buffer,
strlen
(buffer), 0, (
struct
sockaddr*)&clients[clientCount - 1].address,
sizeof
(clients[clientCount - 1].address));
}
close(serverSocket);
pthread_mutex_destroy(&mutex);
return
0;
}