#include #include #include #include #include #include #include #include #include void* handle_client(void *); int client_list[16]; int client_list_len; int main(int argc, char *argv[]) { int sockfd, connfd; pthread_mutex_t list_lock; pthread_mutex_init(&list_lock, NULL); struct sockaddr_in servaddr, cli; sockfd = socket(AF_INET, SOCK_STREAM, 0); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); int port = atoi(argv[1]); servaddr.sin_port = htons(port); bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(sockfd, 128); printf("Server started at %s...\n", inet_ntoa(servaddr.sin_addr)); fflush(stdout); while(1) { socklen_t len = sizeof(cli); connfd = accept(sockfd, (struct sockaddr *)&cli, &len); int i = getpeername(connfd, (struct sockaddr*)&cli, &len); pthread_mutex_lock(&list_lock); client_list[client_list_len] = connfd; client_list_len += 1; pthread_mutex_unlock(&list_lock); int n; char buf[100]; // if((pid=fork())==0){ // close(sockfd); // while((n = recv(connfd, buf, 100, 0)) > 0) { // printf("Client message: %s\n", buf); // fflush(stdout); // for (int i = 0; i < client_list_len; i++) { // int curr_conn = client_list[i]; // if (i != connfd) { // send(i, buf, n, 0); // } // } // }; // exit(0); // } pthread_t client_thread; pthread_create(&client_thread, NULL, &handle_client, &connfd); } return 0; } void* handle_client(void* param) { int *connfd = (int *) param; int n; char buf[100]; while ((n = recv(*connfd, buf, 100, 0)) > 0) { printf("Client message (%d): %s", *connfd, buf); fflush(stdout); for (int i = 0; i < client_list_len; i++) { int curr_conn = *(client_list + i); if (curr_conn != *connfd) { send(curr_conn, buf, n, 0); } } } return 0; }