socket.arrêt vs socket.fermer
J'ai récemment vu un peu de code qui ressemble à ceci (avec chaussette être une socket de cours):
sock.shutdown(socket.SHUT_RDWR)
sock.close()
Quel est exactement le but de l'appel de l'arrêt sur le socket, puis de le fermer? Si cela fait une différence, cette prise est utilisée pour les non-bloquant IO.
Vous devez vous connecter pour publier un commentaire.
Voici un explication:
Appel
close
etshutdown
avoir deux effets différents 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 (dans les faits, l'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é et que le socket n'est pas libéré.
D'autre part l'appel de
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 ne pas libérer le socket et vous avez toujours besoin d'appeler le fermer par la suite.shutdown()
n' 🙂.shutdown()
et sur la ligne suivante.close()
? Ou devrait-il y avoir un délai entre les deux?Explication de l'arrêt et la fermeture: Graceful shutdown (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.
De l'OMI, les noms sur "arrêter" et "fermer" sont trompeuses, 'fermer' et de 'détruire' mettrait l'accent sur leurs différences.
il a droit mentionné dans la Programmation Socket HOWTO (py2/py3)
N'est-ce pas de code ci-dessus le mal?
La clôture de l'appel directement après l'arrêt d'appel peut rendre le noyau jeter tous les tampons 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
on doit attendre entre l'arrêt et de le fermer jusqu'à ce que read retourne 0.
il y a quelques saveurs de l'arrêt: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx. *nix est similaire.
D'arrêt(1) , les forces de la prise d'envoyer plus de données
C'est utile dans
1 - Tampon de rinçage
2 - Étrange erreur de détection
3 - sauvegarder
Laissez-moi vous expliquer plus , lorsque vous envoyez des données de A à B , il n'est pas garanti
envoyé à B , c'est seulement garanti pour être envoyé à l'Un os de la mémoire tampon ,
qui à son tour envoie au B de l'os de la mémoire tampon
En appelant d'arrêt(1) sur Un , de vous vider Un tampon et une erreur est générée
si le tampon n'est pas vide, c'est à dire: les données n'ont pas été envoyés par les pairs encore
Howoever c'est irrevesable , de sorte que vous pouvez le faire après avoir complètement
envoyé toutes vos données et vous voulez être sûr qu'il est au moins au pair
os tampon