118 votes

socket.shutdown vs socket.close

Récemment, j’ai vu un peu de code qui ressemble à ceci (avec chaussette étant un objet socket bien sûr) :

Quel est exactement le but d’appeler shutdown sur la prise et puis fermez-le ? Si cela fait une différence, cette prise est utilisée pour les e/s non bloquantes.

231voto

Robert S. Barnes Points 17244

Appelant close et shutdown ont deux effets sur le socket sous-jacente.

La première chose à souligner est que le support est une ressource dans l'OS sous-jacent et plusieurs processus peuvent avoir une poignée pour le même socket sous-jacente.

Lorsque vous appelez close il décrémente le nombre de handles par un, et si le nombre de handles a atteint zéro, alors la prise d'alimentation et de connexion associé passe par la fermeture normale de la procédure (envoi d'un FIN / expressions du FOLKLORE par les pairs) et la prise de courant est libéré.

La chose à payer l'attention ici, c'est que si le nombre de handles n'atteint pas zéro car un autre processus a encore une poignée à la prise, puis la connexion n'est pas fermée et que le socket n'est pas libéré.

D'autre part appelant shutdown pour la lecture et l'écriture ferme la connexion sous-jacente et envoie une FIN / expressions du FOLKLORE par les pairs, indépendamment de la façon dont de nombreux processus ont des poignées pour le socket. Cependant, il n'est pas de libérer le socket et vous avez toujours besoin d'appeler le fermer par la suite.

37voto

Bob Nadler Points 1959

Voici une explication:

Une fois un socket n'est plus nécessaire, le programme appelant peut jeter l' prise par l'application d'un proche sous-routine le descripteur de socket. Si un livraison fiable que l'orbite de données associé à quand un proche prend lieu, le système continue à essayer le transfert de données. Toutefois, si les données sont encore de non distribution, le système de rejets les données. Si la demande programme n'ont aucune utilité pour les en attente de données, il peut utiliser la mise à l'arrêt sous-programme sur le support avant de fermeture.

17voto

gridzbi Points 698

Explication de l'arrêt et de fermeture: fermeture en douceur (msdn)

Arrêt (dans votre cas) indique à l'autre extrémité de la connexion n'a plus l'intention de lecture ou d'écriture sur le support. Puis fermez libère toute la mémoire associée à la socket.

En omettant d'arrêt peut provoquer la prise de s'attarder dans l'OSs de la pile jusqu'à ce que la connexion a été fermée correctement.

IMO le nom "arrêter" et "fermer" sont trompeuses, 'fermer' et de 'détruire' mettrait l'accent sur leurs différences.

4voto

Christian Points 1102

N’est pas ce code ci-dessus mal ?

L’appel de close directement après l’appel de l’arrêt pourrait faire le noyau jeter tous les tampons sortants de toute façon.

Selon http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable il faut attendre entre la fermeture et la fin de lecture retourne 0.

3voto

Ray Tayek Points 4635

Il y a des saveurs d’arrêt : http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx. * nix est similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X