ça marche bien, mais j'ai fait le test de couper le client (Ctrl-C) , et c'est là que le comportement du serveur est plutôt spécial.
Voila le bout de code qui pose problème:
while (1) {
[ ... attente de connexion avec accept() ...]
while (1) {
nRead = read(0, buf, sizeof buf);
if (write(newsock, buf, nRead) < 1) {
perror("write");
close(newsock);
break;
}
}
}
Donc lorsque je coupe le client, le serveur se coupe au niveau du write() en retournant le code 141 (j'ai mis des printf avant et après le write, c'est bien au niveau du write que le programme exit).
Je suppose que c'est un comportement normal, mais je n'ai rien trouvé là dessus sur google ou dans le man de la fonction write.
Donc je vous pose la question: Comment faire pour détecter avant le write() que la connexion du client est coupée ?
# read
Posté par lukeg . Évalué à 0.
nRead = read(0, buf, sizeof buf);
if (nRead >0)
{
if (write(newsock, buf, nRead) < 1) {
perror("write");
close(newsock);
break;
}
}
else
{
pb avec read
}
# peut-être que...
Posté par Sylvain Rampacek (site web personnel) . Évalué à 2.
write renvoie le nombre d'octets écrits (0 signifiant aucune écriture), ou -1 s'il échoue
donc peut-être qu'il n'a simplement rien écrit (0).
vu ton test (<1), ça pourrait être ça !
# MSG_NOSIGNAL (man send)
Posté par deneb . Évalué à 2.
Je pense aussi qu'il serait utile de rajouter un if (nRead < 1) break après l'appel de la fonction read().
Autre petit détail, dans ton code, le perror() n'affichera pas d'erreur dans le cas ou write() retourne 0.
[^] # Re: MSG_NOSIGNAL (man send)
Posté par andeus . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.