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
et le client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Merci à ceux qui ont pris le temps de lire et de reflechir un peu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"; } }
Partager