2010-03-10 12 views
22

Je sais que read() est un appel bloquant sauf si je rends le socket non bloquant. Je m'attends donc à ce que l'appel read() qui demande 4K de données renvoie une valeur positive (pas d'octets lus) ou -1 en cas d'erreur (réinitialisation possible de la connexion par le client, etc.). Ma question est la suivante: Est-ce que read() peut renvoyer '0' à n'importe quelle occasion?La fonction read() sur une socket connectée peut-elle renvoyer zéro octet?

Je manipulation de la lecture() de cette façon:

if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0) 
    { 

    } 
    else 
    { 
     buf[readval] = 0; 
     //Do some thing with data 
    } 

Ce bombes de code si read() renvoient zéro et je sais comment y remédier. Mais est-il possible que read() renvoie zéro?

+0

Avez-vous envisagé de lire la page * man *? – EJP

Répondre

41

Lorsqu'une connexion TCP est fermée d'un côté, read() de l'autre côté renvoie 0 octet.

+3

La lecture ne doit-elle pas renvoyer -1 avec errno défini sur ECONNRESET? C'est en fait une condition d'erreur, si l'autre côté a fermé la connexion. Devrions-nous considérer le retour de zéro comme une condition d'erreur? – kumar

+6

+1 read() renvoie zéro lorsque la connexion est fermée. –

+1

@kumar: renvoyer zéro vous permet de déterminer qu'un arrêt ordonné s'est produit, par opposition à une erreur réelle. –