Forum Programmation.c write() quitte mon programme et retourne le code 141

Posté par .
Tags : aucun
0
6
nov.
2005
Voila, je débute en C, et après le Hello World je m'amuse à écrire un petit serveur tout ce qu'il y a de plus basique qui écrit sur la socket tout ce qu'il reçoit sur l'entrée standard, avec un client qui écrit sur la sortie standard tout ce qu'il reçois du serveur.

ç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 . Évalué à 0.

    essai de voir combien te retourne read

    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 (page perso) . Évalué à 2.

    extrait du 'man 2 write' :

    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 . Évalué à 2.

    Tu peux remplacer la fonction write() en utilisant send(newsock, buf, nRead, MSG_NOSIGNAL) à la place. Ceci permettra à la fonction d'ignorer le SIGPIPE qui termine ton programme en signal 13 (141 - 128).

    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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.