2010-11-13 24 views

Répondre

2

Vous devez vérifier la valeur de retour du deuxième appel - shutdown(2) renvoie probablement -1 - et vérifiez la valeur de errno(3).

+0

Alors shutdown (2) fonctionne toujours et le résultat est probablement -1? Je suis juste inquiet si shutdown (2) peut planter mon programme en envoyant une sorte de signal, comme SIGPIPE ... – root

+0

Non, retourner '-1' signifie que cela n'a pas fonctionné, c'est la ** valeur de retour d'erreur ** . Cela ne veut pas dire que vous devriez écrire vos programmes afin de ne pas connaître l'état de la socket lorsque vous l'utilisez. –

+0

Alors le 2e appel tue-t-il le programme? – root

0

Vous pouvez l'appeler une fois pour arrêter la sortie et à nouveau pour arrêter l'entrée, ou vice versa. L'appeler deux fois pour arrêter la sortie n'enverra certainement pas deux FIN, quoi qu'il puisse faire d'autre. L'appeler deux fois pour éteindre l'entrée ne peut rien faire deux fois non plus. Donc, aucun de ceux-ci ne peut avoir de point réel.

NB Vous ne pouvez pas appeler sur un descripteur de fichier du tout. Vous pouvez l'appeler sur un descripteur de socket .

0

L'appel shutdown déclenche simplement une séquence d'arrêt du niveau TCP. Le descripteur de socket n'est jamais libéré pour être réutilisé jusqu'à ce que vous appeliez close dessus.

Vous pouvez appeler le shutdown aussi souvent que vous le souhaitez, mais il est probable que les appels suivants entraîneront une erreur.

Appelez close lorsque vous avez terminé le socket.

0

Sur ma version de Linux et de la glibc, je peux appeler le shutdown plusieurs fois sur le même socket ouvert. Il renverra heureusement 0 jusqu'à ce que le socket soit réellement arraché dans cette direction et renverra -1 avec errno == ENOTCONN. Il ne renverra pas EBADF jusqu'à ce que vous close le FD et alors vous ne devriez pas encore utiliser cette FD de toute façon.

Ce fait est en fait très utile, car vous pouvez appeler l'arrêt dans une boucle afin de détecter que la connexion a été détruite d'une manière ou d'une autre. epoll e pour les erreurs sur le socket semble le réveiller au bon moment.