View previous topic :: View next topic |
Author |
Message |
Elbac n00b
![n00b n00b](/images/ranks/rank_rect_0.gif)
Joined: 20 Nov 2005 Posts: 15
|
Posted: Thu Jan 19, 2006 10:27 pm Post subject: [Sockets en C] fonction read bloquante? |
|
|
Bonjour,
Je sais pas si c'est le bon forum pour poser cette question, mais ça me turlupine depuis un moment.
Voilà le code:
Code: | while((l=read(sock,in,sizeof(in)))>0){
printf(in);
}
|
Bien sûr avant tout ça, j'ai créé une socket, et là je veux simplement lire tout ce qui arrive dessus.
Mon problème est: pourquoi je ne peux pas faire ça plutot?:
Code: | while(1){
read(sock, in, sizeof(in));
printf(in);
}
|
Dans ce cas j'ai une boucle sans fin avec pleins de caractéres bizarres alors que read est une fonction bloquante non? |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Saigneur Apprentice
![Apprentice Apprentice](/images/ranks/rank_rect_2.gif)
![](images/avatars/12075679314188c76b2aeb6.gif)
Joined: 21 Oct 2004 Posts: 277 Location: Evry, Essonne, France (48°35'N, 02°15'E)
|
Posted: Thu Jan 19, 2006 10:35 pm Post subject: |
|
|
Suis pas un pro en C (encore moins en sockets) ,mais si tu ne dis pas à ta fonction printf de s'arrêter quand "read" n'est plus bon, tu va printer des trucs qui ne sont pas lus, donc dans une mauvaise partie de mémoire. Le "while ((l=read)>0)", t'assure que tu n'affiches QUE ce qui a bien été lu par read. Si ce n'est plus le cas, tu as ton (l=read) = 0 (je pense), donc la boucle s'arrête et tu ne lis plus n'importe quoi; parce que ton sock,in va prendre des valeurs farfelues si tu continues de les lire sans arrêter. C'est comme afficher le contenu d'une chaîne AZT au delà de la fin : tu lis des trucs bizarres de la mémoire.
Corrigez moi si je me trompe ![Wink :wink:](images/smiles/icon_wink.gif) _________________ Tant pis si ça saigne, pourvu que ça rentre. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Elbac n00b
![n00b n00b](/images/ranks/rank_rect_0.gif)
Joined: 20 Nov 2005 Posts: 15
|
Posted: Thu Jan 19, 2006 10:50 pm Post subject: |
|
|
merci pour ta réponse.
Le probléme est que si read est bloquant, printf ne devrait pas continuer, puisque l'on serait en train d'attendre avec le read. Or en pratique, ce n'est pas ce qui se passe, et je ne comprends pas trés bien pourquoi.
Ce que je voudrais c'est une fonction qui m'affiche tout ce qui arrive sur la socket. A chaque fois que quelque chose est disponible sur la socket, je la lis. C'est donc bien une boucle sans fin que je dois écrire. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
widan Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/142533236243680bda6f27b.jpg)
Joined: 07 Jun 2005 Posts: 1512 Location: Paris, France
|
Posted: Thu Jan 19, 2006 11:43 pm Post subject: |
|
|
Elbac wrote: | Le probléme est que si read est bloquant, printf ne devrait pas continuer, puisque l'on serait en train d'attendre avec le read. Or en pratique, ce n'est pas ce qui se passe, et je ne comprends pas trés bien pourquoi. |
Le read() n'est bloquant que si la connexion n'est pas fermée de l'autre côté. Un exemple (avec un pipe, mais c'est pareil pour les sockets):
Code: | #define PIPE_RD 0
#define PIPE_WR 1
int main(void) {
int fd, p[2], rv, i;
char str[] = "Gentoo", c;
pipe(p);
if (fork()) {
close(p[PIPE_WR]);
while (1) {
printf("READER WAITING FOR DATA\n");
rv = read(p[PIPE_RD], &c, 1);
printf("READER GOT retval=%i char=%c%s%s\n", rv, c,
rv == 0 ? " NODATA" : "",
rv < 0 ? " ERROR" : "");
if (rv <= 0)
break;
}
close(p[PIPE_RD]);
printf("READER DONE\n");
} else {
close(p[PIPE_RD]);
printf("WRITER STARTING\n");
for (i = 0; i < strlen(str); i++) {
sleep(1);
printf("WRITER WRITING c=%c\n", str[i]);
write(p[PIPE_WR], str + i, 1);
}
printf("WRITER DONE WRITING, WAITING\n");
sleep(4);
printf("WRITER DONE, CLOSING PIPE END\n");
close(p[PIPE_WR]);
printf("WRITER DONE\n");
}
} |
Lances le programme et regarde ce qui se passe. Le dernier read() est bien bloquant tant que l'autre extrémité du pipe n'est pas fermée (ça se voit clairement quand on lance le programme). Dès que c'est fermé, le read() renvoie 0 immédiatement. Heureusement que c'est comme ça d'ailleurs, sinon le lecteur serait bloqué indéfiniment (une fois le pipe - ou la connection pour un socket - fermé, il n'y aura plus jamais de données à lire).
Elbac wrote: | Ce que je voudrais c'est une fonction qui m'affiche tout ce qui arrive sur la socket. A chaque fois que quelque chose est disponible sur la socket, je la lis. C'est donc bien une boucle sans fin que je dois écrire. |
Il y a bien une fin pourtant. Une fois la connexion fermée, il faut bien arrêter de lire. |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Elbac n00b
![n00b n00b](/images/ranks/rank_rect_0.gif)
Joined: 20 Nov 2005 Posts: 15
|
Posted: Thu Jan 19, 2006 11:57 pm Post subject: |
|
|
merci bien, j'ai résolu mon probléme... |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|