#include #include #include #include #include #include #include #include #include // A global that is a list of clients int* client_list; size_t client_list_size = 0; size_t client_list_mem; struct ctparam { size_t clpos; char ipaddr[16]; }; void* client_thread(void* param){ struct ctparam *ctp = (struct ctparam*)param; int cfd = client_list[ctp->clpos]; // Handle interaction with one particular client char buffer[1024]; ssize_t readlen; for(;;){ readlen = read(cfd, buffer, 1024); if(readlen <= 0) break; for(size_t i = 0; i < client_list_size; i++){ if(client_list[i] > 2){ write(client_list[i], ctp->ipaddr, strlen(ctp->ipaddr)); write(client_list[i], ": ", 3); write(client_list[i], buffer, readlen); } } } // If the client disconnects, we need to deal with that! close(cfd); client_list[ctp->clpos] = 2; free(ctp); return 0; } int main(int args, char ** argv){ struct sockaddr_in sad; sad.sin_port = htons(5141); sad.sin_addr.s_addr = INADDR_ANY; sad.sin_family = AF_INET; int skt = socket(AF_INET, SOCK_STREAM, 0); bind(skt, (struct sockaddr *)(&sad), sizeof(struct sockaddr_in)); listen(skt, 5); int client_fd; struct sockaddr_in client_addr; client_list = (int*)malloc(sizeof(int) * 1024); client_list_mem = 1024; for(;;){ socklen_t client_address_length; client_fd = accept(skt, (struct sockaddr*)&client_addr, &client_address_length); printf("Accepted a connection from %s\n", inet_ntoa(client_addr.sin_addr)); client_list[client_list_size++] = client_fd; if(client_list_size >= client_list_mem){ client_list = (int*)realloc(client_list, sizeof(int) * (client_list_mem + 1024)); client_list_mem += 1024; } // Start a thread to talk to that client pthread_t thread; struct ctparam *ctp = (struct ctparam*)malloc(sizeof(struct ctparam)); ctp->clpos = client_list_size - 1; strncpy(ctp->ipaddr, inet_ntoa(client_addr.sin_addr), 16); pthread_create(&thread, 0, client_thread, ctp); } close(skt); return 0; }