聊天室在Linux中的C / Socket编程

我有一个简单的服务器和客户端C代码来为multithreading使用线程(pthread库)做一个聊天室。 我一直在遇到的问题是,我不能想办法让服务器写客户端通过套接字发送到所有其他客户端的每条消息。 我在这里读过其他类似的post,很无奈。 请帮助我,我需要为学校做这个。 我会马上发送这两个代码。

Server.c:

#include<stdio.h> #include<string.h> //strlen #include<stdlib.h> //strlen #include<sys/socket.h> #include<arpa/inet.h> //inet_addr #include<unistd.h> //write #include<pthread.h> //for threading , link with lpthread void *connection_handler(void *); int main(int argc , char *argv[]) { int socket_desc , new_socket , c , *new_sock; struct sockaddr_in server , client; char *message; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons( 8888 ); //Bind if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) { puts("bind failed"); return 1; } puts("bind done"); //Listen listen(socket_desc , 3); //Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) ) { puts("Connection accepted"); pthread_t sniffer_thread; new_sock = malloc(1); *new_sock = new_socket; if( pthread_create( &sniffer_thread , NULL , connection_handler , (void*) new_sock) < 0) { perror("could not create thread"); return 1; } //Now join the thread , so that we dont terminate before the thread //pthread_join( sniffer_thread , NULL); puts("Handler assigned"); } if (new_socket<0) { perror("accept failed"); return 1; } return 0; } /* * This will handle connection for each client * */ void *connection_handler(void *socket_desc) { //Get the socket descriptor int sock = *(int*)socket_desc; int read_size; char *message , client_message[2000]; //Receive a message from client while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 ) { //Send the message back to client write(sock , client_message , strlen(client_message)); } if(read_size == 0) { puts("Client disconnected"); fflush(stdout); } else if(read_size == -1) { perror("recv failed"); } //Free the socket pointer free(socket_desc); return 0; } 

Client.c

 #include<stdio.h> //printf #include<string.h> //strlen #include<sys/socket.h> //socket #include<arpa/inet.h> //inet_addr int main(int argc , char *argv[]) { int sock; struct sockaddr_in server; char message[1000] , server_reply[2000]; //Create socket sock = socket(AF_INET , SOCK_STREAM , 0); if (sock == -1) { printf("Could not create socket"); } puts("Socket created"); server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons( 8888 ); //Connect to remote server if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) { perror("connect failed. Error"); return 1; } puts("Connected\n"); puts("Bienvenido al Chatroom, puedes empezar a escribir en la sala!"); //keep communicating with server while(1) { printf("Enter message: "); fgets(message, sizeof(message),stdin); //scanf("%s" , message); //Send some data if( send(sock , message , strlen(message) , 0) < 0) { puts("Send failed"); return 1; } //Receive a reply from the server if( recv(sock , server_reply , 2000 , 0) < 0) { puts("recv failed"); break; } printf("Server Reply: %s\n", server_reply); server_reply[0]='\0'; } close(sock); return 0; } 

这些程序非常简单,客户端发送用户在控制台中写入的内容,服务器将相同的消息发送回去。 我只需要服务器发送相同的消息到每个线程(客户端)连接(不仅是发送原始消息的人)。

我知道这是长期的任何人照顾,但如果可以的话,我会很乐意得到一些帮助:)

Solutions Collecting From Web of "聊天室在Linux中的C / Socket编程"

您需要一个由互斥锁保护的所有客户端的全局表。 当新客户端连接时,将它们添加到客户端的全局表中。 当客户端断开连接时,将其从全局表中删除。

当客户端发送消息时,获取全局表上的锁并遍历它。 将消息发送给所有客户端(除了发送消息的消息之外,如果您不想将消息回送到其源)。

这是真正的服务器如何做到这一点的过分简单化。 但它应该足以让你开始。