Frage

Vor kurzem sehe ich ein Stück Code, der so aussah (mit Socke ein Socket-Objekt natürlich zu sein):

sock.shutdown(socket.SHUT_RDWR)
sock.close()

Was genau ist der Zweck Abschaltung auf dem Sockel des Aufrufs und wieder schließen? Wenn es einen Unterschied macht, wird diese Buchse zum verwendeten nicht-blockierende IO.

War es hilfreich?

Lösung

Hier ist ein Erklärung :

  

Wenn ein Socket nicht mehr erforderlich ist,   das aufrufende Programm kann das verwerfen   Socket, indem ein enges Unterprogrammes der Anwendung   an den Socket-Deskriptor. Wenn ein   zuverlässige Lieferung Socket Daten   damit verbunden ist, wenn ein enger nimmt   Ort, fährt das System zu versuchen,   Datentransfer. Wenn jedoch die Daten   noch nicht zugestellte, das System verwirft   die Daten. Wird der Antrag   Programm haben keine Verwendung für alle ausstehenden   Daten, kann es die Abschaltung verwenden   Subroutine auf dem Sockel vor   Schließen sie.

Andere Tipps

Beim close und shutdown haben zwei unterschiedliche Auswirkungen auf die zugrunde liegenden Socket.

Das erste, was darauf hin, dass die Buchse eine Ressource in dem zugrunde liegenden Betriebssystem ist und mehr Prozesse können einen Griff für den gleichen zugrunde liegenden Socket haben.

Wenn Sie anrufen close es dekrementiert die Handleanzahl von ein und wenn der Griff Zahl Null ist, dann die Buchse und die zugehörige Verbindung geht über das normale schließen Verfahren (effektiv das Senden eines FIN / EOF an den Peer) erreicht hat und die Buchse wird aufgehoben .

Die Sache Aufmerksamkeit hier zu zahlen ist, dass, wenn die Handleanzahl Null nicht erreichen, weil ein anderer Prozess noch einen Griff in die Steckdose muss dann die Verbindung nicht geschlossen ist und die Steckdose ist nicht aufgehoben.

Auf der anderen Seite ruft shutdown zum Lesen und Schreiben schließt die zugrundeliegende Verbindung und sendet ein FIN / EOF an den Peer unabhängig davon, wie viele Prozesse haben Griffe in die Steckdose. Es ist jedoch nicht ausplanen die Steckdose, und Sie müssen noch in der Nähe später nennen.

Erklärung der Abschaltung und in der Nähe: Graceful Shutdown (MSDN)

Shutdown (in Ihrem Fall) zeigt das andere Ende der Verbindung keine weitere Absicht von zu lesen ist oder an die Buchse schreiben. Dann schließen Sie alle Speicher mit der Steckdose verbunden sind entlastet.

shutdown Weglassen kann bewirken, dass der Sockel in dem OSs Stapel verweilen, bis die Verbindung ordnungsgemäß geschlossen wurde.

IMO die ‚Shutdown‘ Namen und ‚schließen‘ sind irreführend, ‚schließen‘ und ‚zerstören‘ würde ihre Unterschiede hervorzuheben.

es erwähnt direkt im Socket-Programmierung HOWTO ( py2 / < a href = "http://docs.python.org/3/howto/sockets.html#disconnecting" rel = "noreferrer"> py3 )

  

Disconnecting

     

Genau genommen, du sollte shutdown auf einem Sockel verwenden, bevor Sie es close.   Die shutdown ist ein Beratungs an die Buchse am anderen Ende. Je nach Argumente Sie es passieren, kann es bedeuten, „ Ich bin nicht mehr senden werde, aber ich werde immer noch hören “ oder „ Ich höre nicht zu, Good Riddance! “.   Die meisten Socket-Bibliotheken sind jedoch so zu Programmierern verwendet vernachlässigen dieses Stück Etikett zu verwenden, die normalerweise ein close die gleichen wie shutdown(); close() ist.   So in den meisten Fällen eine explizite Abschaltung ist nicht erforderlich.

     

...

Ist das nicht angezeigten Code falsch?

Der enge Anruf direkt nach dem Shutdown könnte den Kernel verwirft alle abgehenden Puffer sowieso machen.

Nach http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable man braucht 0 zwischen dem Abschalten und der Nähe, bis Lese kehrt zu warten.

gibt es einige Varianten von Abschaltung: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . * Nichts ist ähnlich.

Shutdown (1), zwingt die Buchse keine keine weiteren Daten zu senden

Dies ist nützlich in

1- Pufferspülung

2- merkwürdige Fehlererkennungs-

3- Sicher Bewachungs

Lassen Sie mich erklären, mehr, wenn Sie eine Daten von A nach B zu senden, ist es nicht zu sein, garantiert gesendet B, es ist nur dann gewährleistet an den A o Puffer gesendet werden, was wiederum sendet sie an den B os Puffer

So durch Abschaltung (1) auf einem Aufruf, Sie Flush A-Puffer und ein Fehler wird angehoben wenn der Puffer nicht leer, dh ist: Daten nicht an den Peer noch gesendet worden

Howoever dies irrevesable, so können Sie, nachdem Sie das tun vollständig sendete alle Ihre Daten und Sie wollen sicher sein, dass es atleast im Peer ist os Puffer

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top