2009-12-20 3 views
2

Dans mon programme, j'ai besoin de vérifier l'achèvement d'une opération sendfile() dans un socket non bloquant. Comment cela peut-il être fait?Achèvement de sendfile() sur un socket non bloquant

Après avoir vérifié la documentation et de recherche sur Internet, je ne pouvais pas savoir comment faire

Répondre

6

Il fonctionne de manière similaire à send(): si la prise est définie comme O_NONBLOCK et l'opération bloquerait, sendfile() retourne immédiatement et définit errno à EAGAIN. Dans ce cas, vous devez attendre un moment, puis réessayer (peut-être en utilisant une fonction comme select() pour savoir quand il est prêt). De plus, gardez à l'esprit que même s'il réussit, il risque de ne pas écrire tous les octets que vous avez demandés dans un appel de fonction unique. Vérifiez toujours la valeur de retour:

Si le transfert a réussi, le nombre d'octets écrits sur out_fd est renvoyé. En cas d'erreur, -1 est renvoyé et errno contient le code d'erreur.

Vous pouvez également jeter un oeil à la man page for sendfile()

+2

Pour développer un peu: si 'sendfile()' retourne une valeur> 0, alors que le nombre d'octets ont été envoyés avec succès - il n'y a pas besoin d'attendre achèvement. "Non-bloquant" n'implique pas "asychrone". – caf

+0

Juste pour confirmer: select() rapportera le socket comme étant inscriptible (FD_ISSET() == true) quand le bloc courant a été vidé. Vous devez ensuite appeler à nouveau sendfile(), mais conserver un nouveau décalage. – Leolo

+0

@caf: Que se passe-t-il lorsque le descripteur de fichier * input * bloque? –

Questions connexes