L'appel close
et shutdown
ont deux effets différents sur le socket sous-jacent.
La première chose à souligner est que le socket est une ressource dans le système d'exploitation sous-jacent et que plusieurs processus peuvent avoir un handle pour le même socket sous-jacent.
Lorsque vous l'appelez close
décrémente le nombre de descripteurs de un et si le nombre de descripteurs a atteint zéro, le socket et la connexion associée passent par la procédure de fermeture normale (en envoyant effectivement un FIN / EOF à l'homologue) et le socket est désalloué.
Ce à quoi il faut faire attention ici est que si le nombre de descripteurs n'atteint pas zéro parce qu'un autre processus a encore un descripteur sur le socket, la connexion n'est pas fermée et le socket n'est pas désalloué.
D'autre part, l'appel shutdown
à la lecture et à l'écriture ferme la connexion sous-jacente et envoie un FIN / EOF à l'homologue quel que soit le nombre de processus qui ont des descripteurs sur le socket. Cependant, il ne désalloue pas le socket et vous devez toujours appeler close par la suite.
Robert S. Barnes
la source
shutdown()
fait :).shutdown()
et sur la ligne suivante.close()
? Ou devrait-il y avoir un délai entre les deux?Explication de l'arrêt et de la fermeture: arrêt progressif (msdn)
Shutdown (dans votre cas) indique à l'autre extrémité de la connexion qu'il n'y a plus aucune intention de lire ou d'écrire sur le socket. Puis close libère toute mémoire associée au socket.
L'omission de l'arrêt peut entraîner la persistance du socket dans la pile des systèmes d'exploitation jusqu'à ce que la connexion ait été fermée correctement.
OMI les noms «arrêt» et «fermer» sont trompeurs, «fermer» et «détruire» souligneraient leurs différences.
la source
il est mentionné directement dans le Socket Programming HOWTO ( py2 / py3 )
la source
close()
c'est suffisant. La documentation Python doit être corrigée.Ce code ci-dessus n'est-il pas faux?
L'appel de fermeture directement après l'appel d'arrêt peut faire en sorte que le noyau rejette de toute façon tous les tampons sortants.
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 l'arrêt et le close jusqu'à ce que read renvoie 0.
la source
il existe quelques types d'arrêt: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . * nix est similaire.
la source
Shutdown (1), force le socket no à envoyer plus de données
Ceci est utile dans
1- Rinçage du tampon
2- Détection d'erreur étrange
3- Protection sûre
Permettez-moi de vous expliquer plus, lorsque vous envoyez une donnée de A à B, il n'est pas garanti qu'elle soit envoyée à B, elle est uniquement garantie d'être envoyée au tampon A os, qui à son tour l'envoie au tampon B os
Donc en appelant shutdown (1) sur A, vous videz le tampon de A et une erreur est levée si le tampon n'est pas vide c'est-à-dire: les données n'ont pas encore été envoyées au pair
Cependant, cela est irréversible, vous pouvez donc le faire après avoir complètement envoyé toutes vos données et vous voulez être sûr que c'est au moins dans le tampon du système d'exploitation du pair.
la source