Pb communication socket

Signaler
Messages postés
34
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
26 novembre 2007
-
Messages postés
17
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
19 août 2007
-
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

Messages postés
17
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
19 août 2007

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)