smdu57 | Bonjour a tous Je suis étudiant en DUT Informatique et je dois rendre un projet a programmer en C et je me heurte a un gros problème Voila le projet consiste a créer un programme serveur et un programme client qui communiquent entre eux via des sockets pour créer un chat. Le programme concernant la création du serveur et des sockets ainsi que la connexion client est donné par le professeur.
Mon problème que j'essaye de résoudre depuis 2 semaines est le suivant : Quand j’exécute le programme client (après avoir exécuter le programme serveur) il s’avère que plus d'une fois sur deux le client se déconnecte et fais bug le serveur. Sachant qu'en cas de succès le chat marche bien. De plus le problème est d'autant plus problématique que je dois pouvoir réussir a connecter plusieurs client en même temps.
Tout le code mis en commentaire permet de gérer le pseudo et est fonctionnel dans le programme de plus je ne fournit que le code serveur car je suis presque sur que le problème vient du code serveur Merci pour votre aide
Code :
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netinet/ip.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <time.h>
- typedef struct{
- int * newsockfd;
- }socketdata;
- int compteur;
- pthread_mutex_t m1;
- void * f_com(void *arg){
- socketdata *temp = (socketdata*)arg;
- pthread_mutex_lock(&m1);
- int id =compteur;
- compteur++;
- int i;
- pthread_mutex_unlock(&m1);
- //char pseudo[16];
- printf("Nouveaux Client connecter au numero %d\n",id);
- //read(temp->newsockfd[id],pseudo,sizeof(pseudo));
- //printf("pseudo recus : %s\n",pseudo);
- //char suite[6] = " : ";
- while(1){
- char message[100];
- //char msg[122];
- //strcat(msg,pseudo);
- //strcat(msg,suite);
- //read(temp->newsockfd[id],message,sizeof(msg));
- //printf(" message recut %s \n",message);
- //strcat(msg,message);
- //msg[122] = '\0';
- for (i=0;i<compteur;i++){
- if(i != id){
- write(temp->newsockfd[i],message,sizeof(message));
- }
- }
- //printf(" message envoye \n" );
- }
- }
- int main()
- {
- printf("Serveur démarré\n" );
- pthread_t *thread;
- thread = malloc(sizeof(pthread_t) *10);
- socketdata data;
- data.newsockfd= malloc(sizeof(int) * 10);
- /* Déclaration des variables */
- int sockserveur,newsockfd,lg;
- struct sockaddr_in coord_client;
- struct sockaddr_in mes_coord;
- struct tm *m;
- char* pc;
- char msg[100];
- /* Création d'un socket */
- sockserveur=socket(AF_INET, SOCK_STREAM, 0);
- /* Serveur : appel BIND */
- bzero(&mes_coord,sizeof(mes_coord));
- mes_coord.sin_family=AF_INET;
- mes_coord.sin_port=htons(2001);
- mes_coord.sin_addr.s_addr=htonl(INADDR_ANY);
- if(bind(sockserveur,(struct sockaddr*)&mes_coord,sizeof(mes_coord))<0){
- printf("Erreur BIND\n" );
- exit(0);
- }
- /* Serveur : appel LISTEN */
- if (listen(sockserveur,5)<0){
- printf("Erreur LISTEN\n" );
- exit(0);
- }
- /* Serveur : appel ACCEPT */
- int i;
- for(i=0;i<10;i++){
- lg=sizeof(coord_client);
- data.newsockfd[i]=accept(sockserveur,(struct sockaddr*)&coord_client,&lg);
- pthread_create(&thread[i],NULL,f_com,(void*)&data);
- }
- for(i=0;i<10;i++){
- pthread_join(thread[i],NULL);
- close(data.newsockfd[i]);
- }
- close(sockserveur);
- }
|
|