Tchat en C / Socket de programmation sous Linux

J'ai un simple serveur et le client C le code pour faire un tchat pour multiclients à l'aide de threads (bibliothèque pthread). Le problème que j'ai eu est que je ne peux pas penser à une façon de rendre le serveur d'écrire chaque message que le client envoie sur le support, dans tous les autres clients. J'ai lu d'autres postes similaires dans la ici et il était impuissant. S'il vous plaît aider moi j'ai besoin de le faire pour l'école. Je vais envoyer les deux codes de droit de suite.

Serveur.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;
}

Ces programmes sont très simples, le client envoie ce que l'utilisateur écrit dans la console et le serveur d'envoyer le même message. J'ai juste besoin de serveur pour envoyer le même message à chaque thread (client) connecté (pas seulement celui qui a envoyé le message d'origine).

Je sais que c'est long pour quiconque de soins, mais si vous le pouvez, je serai heureux pour obtenir de l'aide 🙂

  • Est-il nécessaire pour l'utilisation de threads pour cela? Plus facile la conception serait monothread et multiplex les opérations d'e/S à l'aide de select() ou poll(). Ensuite écrit à tous les clients de sockets qui pourrait être fait à l'aide d'une simple boucle for.
  • Oh merci qui va probablement être plus facile. Encore, je ne sais pas comment utiliser select() ou poll() haha. J'ai utilisé les threads parce que récemment, j'ai appris comment les utiliser et ils semblaient tout à fait un pro une solution à mon problème haha. Toute chance vous pourriez me donner un peu de détails sur la façon d'utiliser une de ces fonctions? 🙂
  • Les Threads sont des médicaments très forts, ils peuvent vous mordre, sauf si vous êtes très prudent. J'essaie de ne pas les utiliser à moins qu'il n'y a pas d'autre moyen pour accomplir la tâche. Comme pour le sélectionner(), voir ces liens: lowtek.com/sockets/select.html binarytides.com/multiple-socket-connections-fdset-select-linux
  • Oh merci beaucoup! .. Je pense que je l'ai ou je suis tout à fait près de!
InformationsquelleAutor franpen | 2013-10-13