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