Impossible de lire un socket : le read() retourne segmentation fault
Bonjours tous le monde.
Ça semble simple, ça doit probablement l'Être, mais là je seche.
Je m'entriane tranquillement à faire dialoguer un client et un serveur tout bêtes, avec de simple chaines de caractère mais au moment de fiare un read() par le client, apres un write du serveur, le programme client plante et retourne un une segmentation fault.
Le pire c'est que ça marche tres bien dans un sens : si mon client ne fait qu'ecrire sans lire, le serveur lit sans probleme et tous se déroule correctement. C'est lorsque le serveur ecrit quelque chose sur le socket que là le client plante en voulant lire.
Le serveur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int fd_client = accept (fd, &client,(socklen_t*)&client_len);
pid_t p_client = fork ();
if (p_client == 0)
{
char buf[301];
int n;
close( fd);
while(strcmp(buf,"END") != 0){
if((n = read (fd_client, buf, 300)) >= 0)
{
buf[n] = '\0';
cout<<buf<<"\n";
}
int b = write (fd_client,"OK", 7);
}
close (fd_client);
exit (0);
} |
et le client
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| char buf[301]="";
int n;
char* s;
while(strcmp(s,"q") !=0){
printf ("client connecté à %s (%d.%d.%d.%d) port=%d\n",
server_addr,
(ntohl (server.sin_addr.s_addr) >> 24) & 0xff,
(ntohl (server.sin_addr.s_addr) >> 16) & 0xff,
(ntohl (server.sin_addr.s_addr) >> 8) & 0xff,
(ntohl (server.sin_addr.s_addr) >> 0) & 0xff,
(ntohs (server.sin_port)));
scanf("%s",s);
write (fd, s, 7);
if ((n = read (fd, buf, 300)) <= 0){ //voila le read en question qui ne veut pas se faire
buf[n] = '\0'; //si j'enleve tous ça l'affaire fonctionne
cout << buf<<"\n";
}
} |
Merci à ceux qui ont pris le temps de lire et de reflechir un peu.