Aktiv öffnen ist, wenn Sie explizit connect(2)
ausstellen, um eine Verbindung zu einer Remote-Site herzustellen. Die Call-Blöcke, bis Sie die Buchse auf der anderen Seite geöffnet (außer wenn Sie ausgestellt O_NONBLOCK
fcntl(2)
Anruf vor connect(2)
Aufruf.
Passive offen ist, wenn Sie eine Steckdose haben listen(2)
ing auf eine Verbindung, und Sie haben noch nicht erteilt Ein accept(2)
-Anruf, der normalerweise blockiert, bis Sie eine vollständig geöffnete Verbindung haben und Ihnen einen Socket-Deskriptor für die Kommunikation geben, oder gibt Ihnen sofort einen Socket-Deskriptor, wenn der Verbindungs-Handshake bereits beendet ist, wenn Sie den accept(2)
syscall ausgeben (Dies ist ein passives Öffnen.) Die Grenze in der Anzahl der passiv offenen Verbindungen des Kernels kann in Ihrem Namen annehmen, während Sie sich darauf vorbereiten, den accept(2)
Systemaufruf zu machen, was der listen(2)
Wert genannt wird.
Active schließen ist, was passiert, wenn Sie explizit shutdown(2)
oder close(2)
Systemaufrufe aufrufen. Wie beim passiven Öffnen gibt es nichts, was Sie tun können, um eine passiv schließen (es ist etwas, was hinter den Kulissen geschieht, Produkt der Aktionen anderer Seite). Sie erkennen ein passive schließen wenn der Sockel eine Ende der Datei Zustand erzeugt (dies ist, read(2)
0
Bytes beim Lesen immer wieder), was bedeutet das andere Ende hat ein getan shutdown(2)
(oder close(2)
) und die Verbindung ist Hälfte (oder voll) geschlossen. Wenn Sie explizit shutdown(2)
oder close(2)
Ihrer Seite sind, ist es ein aktiver Abschluss.
HINWEIS
wenn das andere Ende hat eine explizite close(2)
und weiter Sie auf dem Sockel zu schreiben, wird ein Fehler wegen der Unmöglichkeit des Sendens erhalten, dass die Daten (in diesem Fall können wir über ein sprechen passive close(2)
--- eine, die ohne irgendeine explizite Aktion von unserer Seite aufgetreten ist), aber das andere Ende kann eine halb schließen aufrufen shutdown(2)
. Dadurch sendet der TCP nur ein FIN
-Segment und behält den Socket-Deskriptor bei, damit der Thread alle ausstehenden Daten empfangen kann, die gerade übertragen oder noch nicht gesendet wurden. Nur wenn es das FIN
Segment des anderen Endes empfängt und bestätigt, wird es Ihnen signalisieren, dass keine Daten mehr übertragen werden.
* BOTH * A und P sollten * ALL * der von Ihnen erwähnten Schritte ausführen: 'shutdown (SHUT_WR)', dann loop 'recv()', bis <<0, dann 'close()' zurückgegeben wird. Die erste Partei, die diese Schritte ausführt, beginnt mit der Schließung, und dann muss die andere Partei die gleichen Schritte ausführen, sobald sie die Schließung feststellt, sodass beide Parteien wissen, dass beide Enden der Verbindung ordnungsgemäß geschlossen wurden. –
@RemyLebeau: Es gibt also keine Möglichkeit zu kontrollieren, welche Seite aktiv ist und welche die passive? –
Es gibt keine reale Sache als "aktiv" vs "passiv" schließen. Eine Partei kann passiv eine Schließung von der anderen Partei feststellen, aber beide Parteien müssen noch ihr Ende der Verbindung schließen. Es gibt jedoch so etwas wie "graceful" vs. "abortive" close, je nachdem, ob "shutdown()" aufgerufen wird und ob linger am Socket aktiviert ist. Sie sollten immer nach eleganten Schlüssen streben, wann immer es möglich ist. –