Pb communication socket

cs_skyman272 Messages postés 34 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 26 novembre 2007 - 11 mai 2005 à 18:36
jcqguill Messages postés 17 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 19 août 2007 - 28 juin 2005 à 13:43
bonjour

voici un petit programme client/serveur pour un projet à l'insa (sous linux).
Le programme client envoi un message au programme serveur qui lui répond par l'intermediaire d'une socket.
Le pb c'est que le client envoi son message, le serveur répond, puis la communication s'arrete.
Le programme client donne le message d'erreur "broken pipe"
Si quelqu'un a une idée pour me venir en aide... Merci

Le serveur :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>


#define PORT 12345


int main()
{ FILE *fp;
int sock, sock2, lg, pid;
struct sockaddr_in local;
struct sockaddr_in distant;
char mess[80];
bzero(&local, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = INADDR_ANY;
bzero(&(local.sin_zero), 8);
lg = sizeof(struct sockaddr_in);


if((sock=socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket"); exit(1);
}
//le bind
if(bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr)) == -1)
{
perror("bind");exit(1);
}
//Ecoute de la socket de connexion
if (listen (sock, 5) == -1)
{
perror("listen");exit(1);
}
//boucle de reponse aux requetes clients
for (;;)
{
if ((sock2=accept(sock, (struct sockaddr *)&distant, &lg)) == -1)
{
perror("accept");exit(1);
}
printf ("fin dialogue avec client \n");
//creation du processus par le fork
//le processus pere continue l'ecoute
//le processus fils va repondre pour servir les clients connectes
if ((pid=fork ()) < 0)
{
perror ("fork");
exit (1);
}
//processus pere
//ferme la connexion courante
//continue d'ecouter
if (pid > 0)
{
close (sock2);
continue;
}
//processus fils
//ferme la socket serveur
//sert la connexion courante
close (sock);
printf ("connecté avec un client \n");
while (strcmp(mess, "fin") !=0)
{
read(sock2,mess,80);
printf("%s\n",mess);
printf("entrer le message : ");
gets(mess);
write(sock2,mess,sizeof(mess)) ;
strcat(mess,'\r\n');
}
printf ("fin dialogue avec client \n");
close (sock2);
}
return 0;

Le client :

#include <stdio.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>


#define SERV "127.0.0.1"
#define PORT 12345


int main()
{ int port,sock;
struct sockaddr_in serv_addr;
struct hostent *serveur;
char mess[80] ;

port = PORT;
serveur = gethostbyname(SERV);
if (!serveur){fprintf(stderr, "Problème serveur "%s"\n",SERV);exit(1);}


sock = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy(serveur->h_addr, &serv_addr.sin_addr.s_addr,serveur->h_length);
serv_addr.sin_port = htons(port);


printf ("demande connexion\n");
if (connect(sock,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{perror("Connexion impossible");exit(1);}
printf ("client connecte \n");

bcopy("",mess);
while (strcmp(mess, "fin") !=0)
{ printf("entrer le message : "); gets(mess);
write(sock,mess,sizeof(mess)) ;
read(sock,mess,80);
printf("%s\n",mess);
}
printf ("fin client \n");
close (sock);
return 0;
}

1 réponse

jcqguill Messages postés 17 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 19 août 2007
28 juin 2005 à 13:43
Salut !

je viens d'essayer tes sockets.

modifie strcat(mess,'\r\n') par bzero(mess,sizeof(mess))

dans ton serveur et ca devrai marcher.

(en tout cas chez moi ca marche nikel après la modife)
0