#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; 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); int connfd = accept(sockfd, (struct sockaddr*)&cli, &len); int i = getpeername(connfd, (struct sockaddr*)&cli, &len); client_list[client_list_len] = connfd; client_list_len += 1; printf("Clients connected: %d \nDescriptors: ", client_list_len); for(int i = 0; i < client_list_len; i++) { printf("%d ", client_list[i]); } printf("\n"); fflush(stdout); pthread_t client_thread; pthread_create(&client_thread, NULL, &handle_client, &connfd); } close(sockfd); return 0; } void* handle_client(void* param) { int *connfd = (int *) param; int n; char buf[100]; bzero(&buf, 100); while ((n = recv(*connfd, buf, 100, 0)) > 0) { printf("Client message (%d): %s", *connfd, buf); fflush(stdout); send(*connfd, buf, n, 0); bzero(&buf, 100); } close(*connfd); return 0; }