Freigeben über


Ordnungsgemäßes Herunterfahren, Lingeroptionen und Schließen der Steckdose

Das folgende Material wird als Klarstellung für das Thema des Herunterfahrens der Socketverbindungen bereitgestellt, die die Sockets schließen. Es ist wichtig, den Unterschied zwischen dem Herunterfahren einer Socketverbindung und dem Schließen eines Sockets zu unterscheiden.

Das Herunterfahren einer Socketverbindung umfasst einen Austausch von Protokollnachrichten zwischen den beiden Endpunkten, nachfolgend als Herunterfahrenssequenz bezeichnet. Es werden zwei allgemeine Klassen von Herunterfahrenssequenzen definiert: graceful und abortiv (auch als hart bezeichnet). In einer ordnungsgemäßen Herunterfahrensequenz können alle Daten, die in die Warteschlange gestellt wurden, aber noch nicht übertragen werden, vor dem Schließen der Verbindung gesendet werden. Bei einem abgebrochenen Herunterfahren gehen alle nicht gesendeten Daten verloren. Das Auftreten einer Herunterfahrensequenz (ordnungsgemäß oder abbruchfähig) kann auch verwendet werden, um einen FD_CLOSE Hinweis auf die zugehörigen Anwendungen bereitzustellen, die erkennen, dass ein Herunterfahren ausgeführt wird.

Das Schließen eines Sockets führt dagegen dazu, dass der Sockethandle deallocated wird, sodass die Anwendung nicht mehr auf den Socket verweisen oder den Socket auf irgendeine Weise verwenden kann.

In Windows Sockets können sowohl die Herunterfahren-Funktion als auch die WSASendDisconnect-Funktion verwendet werden, um eine Herunterfahren-Sequenz zu initiieren, während die Closesocket--Funktion verwendet wird, um Sockethandles zu behandeln und alle zugehörigen Ressourcen freizugeben. Einige Verwirrung entsteht jedoch aus der Tatsache, dass das Closesocket- Funktion implizit dazu führt, dass eine Abschaltungssequenz auftritt, wenn sie noch nicht geschehen ist. Tatsächlich ist es zu einer ziemlich gängigen Programmierpraxis geworden, auf dieses Feature zu vertrauen und Closesocket- zu verwenden, um die Abschaltungssequenz zu initiieren und den Sockethandle zu ordnen.

Um diese Verwendung zu erleichtern, bietet die Sockets-Schnittstelle Steuerelemente über den Socketoptionsmechanismus, mit dem der Programmierer angeben kann, ob die implizite Herunterfahrensequenz ordnungsgemäß oder abbruchfähig sein soll, und ob die closesocket--Funktion (das ist nicht sofort abgeschlossen) bleiben soll, um Zeit für eine ordnungsgemäße Herunterfahrensequenz zu ermöglichen. Diese wichtigen Unterscheidungen und die Auswirkungen der Verwendung Closesocket- auf diese Weise sind immer noch nicht weit verbreitet.

Durch die Festlegung geeigneter Werte für die Socketoptionen SO_LINGER und SO_DONTLINGER können die folgenden Verhaltenstypen mit der Closesocket--Funktion abgerufen werden:

  • Abortive Herunterfahren sequenz, sofortige Rückgabe von closesocket.
  • Das ordnungsgemäße Herunterfahren wird verzögert, bis entweder die Abschaltung abgeschlossen ist oder ein angegebenes Zeitintervall verstrichen ist. Wenn das Zeitintervall abläuft, bevor die ordnungsgemäße Herunterfahrensequenz abgeschlossen ist, tritt eine abbruchive Herunterfahrensequenz auf, und closesocket zurückgegeben wird.
  • Ordnungsgemäßes Herunterfahren, sofortiges Zurückgeben – sodass die Abschaltungssequenz im Hintergrund abgeschlossen werden kann. Obwohl dies das Standardverhalten ist, hat die Anwendung keine Möglichkeit zu wissen, wann (oder ob) die ordnungsgemäße Herunterfahren-Sequenz tatsächlich abgeschlossen ist.

Die Verwendung der SO_LINGER- und SO_DONTLINGER Socketoptionen und der damit verbundenen Struktur wird in den Referenzabschnitten zu SOL_SOCKET Socketoptionen und der Struktur ausführlicher erläutert.

Eine Technik, die verwendet werden kann, um die Wahrscheinlichkeit von Problemen, die während des Verbindungsabbruchs auftreten, zu minimieren, besteht darin, zu vermeiden, dass ein implizites Herunterfahren durch Closesocketinitiiert wird. Verwenden Sie stattdessen eine der beiden expliziten Herunterfahrensfunktionen, Herunterfahren oder WSASendDisconnect. Dies wiederum bewirkt, dass eine FD_CLOSE Angabe von der Peeranwendung empfangen wird, die angibt, dass alle ausstehenden Daten empfangen wurden. Zur Veranschaulichung zeigt die folgende Tabelle die Funktionen, die von den Client- und Serverkomponenten einer Anwendung aufgerufen werden würden, wobei der Client für das Initiieren eines ordnungsgemäßen Herunterfahrens verantwortlich ist.

Clientseite Serverseite
(1) Ruft Herunterfahren(s, SD_SEND) auf, um das Ende der Sitzung zu signalisieren und dass der Client keine weiteren Daten zum Senden hat.
(2) Empfängt FD_CLOSE, was angibt, dass das ordnungsgemäße Herunterfahren ausgeführt wird und dass alle Daten empfangen wurden.
(3) Sendet alle verbleibenden Antwortdaten.
(nur lokale Zeitliche Bedeutung) Ruft FD_READ und Aufrufe recv ab, um antwortdaten abzurufen, die vom Server gesendet werden. (4) Ruft Herunterfahren(s, SD_SEND) auf, um anzugeben, dass der Server keine weiteren Zusendungsdaten hat.
(5) erhält FD_CLOSE Indikation. (nur lokale Zeitliche Bedeutung) Ruft Closesocket- auf.
(6) Ruft closesocketauf.