Share via


closesocket-Funktion (winsock2.h)

Die Closesocket-Funktion schließt einen vorhandenen Socket.

Syntax

int WSAAPI closesocket(
  [in] SOCKET s
);

Parameter

[in] s

Ein Deskriptor, der den zu schließenden Socket identifiziert.

Rückgabewert

Wenn kein Fehler auftritt, gibt closesocket null zurück. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion.
WSAEINTR
Der (blockierende) Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.
WSAEWOULDBLOCK
Der Socket ist als nicht blockierend gekennzeichnet, aber der l_onoff Member der linger-Struktur wird auf ungleich null festgelegt, und der l_linger Member der linger-Struktur wird auf einen Timeoutwert ungleich null festgelegt.

Hinweise

Die Closesocket-Funktion schließt einen Socket. Verwenden Sie ihn, um den Socketdeskriptor freizugeben, der im s-Parameter übergeben wurde. Beachten Sie, dass der Socketdeskriptor, der im s-Parameter übergeben wird, sofort vom System wiederverwendet werden kann, sobald die Closesocket-Funktion ausgegeben wird. Daher ist es nicht zuverlässig zu erwarten, dass weitere Verweise auf den Socketdeskriptor, die im s-Parameter übergeben werden, mit dem Fehler WSAENOTSOCK fehlschlagen. Ein Winsock-Client darf niemals closesocket für s gleichzeitig mit einem anderen Winsock-Funktionsaufruf ausstellen.

Alle ausstehenden überlappenden Sende- und Empfangsvorgänge ( WSASend/ WSASendTo/ WSARecv/ WSARecvFrom mit einem überlappenden Socket), die von einem beliebigen Thread in diesem Prozess ausgegeben werden, werden ebenfalls abgebrochen. Alle Ereignisse, Vervollständigungsroutinen oder Abschlussportaktionen, die für diese überlappenden Vorgänge angegeben sind, werden ausgeführt. Die ausstehenden überlappenden Vorgänge schlagen mit dem Fehler status WSA_OPERATION_ABORTED fehl.

Eine Anwendung sollte nicht davon ausgehen, dass alle ausstehenden E/A-Vorgänge für einen Socket garantiert abgeschlossen werden, wenn closesocket zurückgegeben wird. Die Closesocket-Funktion initiiert den Abbruch der ausstehenden E/A-Vorgänge. Dies bedeutet jedoch nicht, dass eine Anwendung E/A-Vervollständigung für diese E/A-Vorgänge erhält, wenn die Closesocket-Funktion zurückgibt. Daher sollte eine Anwendung keine Ressourcen (z. B. WSAOVERLAPPED-Strukturen ) bereinigen, auf die von den ausstehenden E/A-Anforderungen verwiesen wird, bis die E/A-Anforderungen tatsächlich abgeschlossen sind.

Eine Anwendung sollte immer über einen übereinstimmenden Aufruf von closesocket für jeden erfolgreichen Aufruf des Sockets verfügen, um Socketressourcen an das System zurückzugeben.

Die linger-Struktur verwaltet Informationen zu einem bestimmten Socket, die angeben, wie sich dieser Socket verhalten soll, wenn Daten gesendet werden sollen und die Closesocket-Funktion für den Socket aufgerufen wird.

Der l_onoff Member der linger-Struktur bestimmt, ob ein Socket nach einem Aufruf der Closesocket-Funktion für eine bestimmte Zeit geöffnet bleiben soll, um das Senden von Daten in die Warteschlange zu ermöglichen. Dieses Element kann auf zwei Arten geändert werden:

  • Rufen Sie die setockopt-Funktion auf, wobei der optname-Parameter auf SO_DONTLINGER festgelegt ist. Der optval-Parameter bestimmt, wie der l_onoff-Member geändert wird.
  • Rufen Sie die setockopt-Funktion auf, wobei der optname-Parameter auf SO_LINGER festgelegt ist. Der optval-Parameter gibt an, wie sowohl die member l_onoff als auch l_linger geändert werden.

Der l_linger Member der linger-Struktur bestimmt, wie lange ein Socket in Sekunden geöffnet bleiben soll. Dieser Member ist nur anwendbar, wenn das l_onoff Member der linger-Struktur ungleich null ist.

Die Standardparameter für einen Socket sind die l_onoff Member der linger-Struktur null ist, was angibt, dass der Socket nicht geöffnet bleiben soll. Der Standardwert für das l_linger Member der linger-Struktur ist 0( Null), aber dieser Wert wird ignoriert, wenn der l_onoff Member auf 0 festgelegt ist.

Damit ein Socket geöffnet bleibt, sollte eine Anwendung den l_onoff Member auf einen Wert ungleich Null und den l_linger Member auf das gewünschte Timeout in Sekunden festlegen. Damit ein Socket nicht geöffnet bleibt, muss eine Anwendung nur den l_onoff Member der linger-Struktur auf 0 (null) festlegen.

Wenn eine Anwendung die setockopt-Funktion aufruft , wobei der optname-Parameter auf SO_DONTLINGER festgelegt ist, um den l_onoff-Member auf einen Wert ungleich Null festzulegen, wird der Wert für den l_linger-Member nicht angegeben. In diesem Fall ist das verwendete Timeout implementierungsabhängig. Wenn ein vorheriges Timeout für einen Socket eingerichtet wurde (durch vorheriges Aufrufen der setockopt-Funktion mit dem optname-Parameter , der auf SO_LINGER festgelegt ist), sollte dieser Timeoutwert vom Dienstanbieter wiederhergestellt werden.

Die Semantik der closesocket-Funktion wird von den Socketoptionen beeinflusst, die Elemente der linger-Struktur festlegen.

l_onoff l_linger Typ des Schließens Warten Sie auf schließen?
Null Egal Ordnungsgemäßes Schließen No
Nonzero Null Schwierig No
Nonzero Nonzero Ordnungsgemäß, wenn alle Daten innerhalb des im l_linger-Member angegebenen Timeoutwerts gesendet werden.

Schwierig, wenn nicht alle Daten innerhalb des im l_linger-Member angegebenen Timeoutwerts gesendet werden konnten.

Yes
 

Wenn der l_onoff Member der LINGER-Struktur in einem Streamsocket gleich null ist, wird der Closesocket-Aufruf sofort zurückgegeben und empfängt nicht WSAEWOULDBLOCK , unabhängig davon, ob der Socket blockiert oder nicht blockiert. Alle Daten, die für die Übertragung in die Warteschlange eingereiht sind, werden jedoch nach Möglichkeit gesendet, bevor der zugrunde liegende Socket geschlossen wird. Dies wird auch als ordnungsgemäßes Trennen oder Schließen bezeichnet. In diesem Fall kann der Windows Sockets-Anbieter den Socket und andere Ressourcen nicht für einen beliebigen Zeitraum freigeben, was sich auf Anwendungen auswirkt, die erwarten, dass alle verfügbaren Sockets verwendet werden. Dies ist das Standardverhalten für einen Socket.

Wenn der l_onoff Member der linger-Struktur ungleich null und l_linger Member null ist, wird closesocket auch dann nicht blockiert, wenn noch keine Daten in der Warteschlange gesendet oder bestätigt wurden. Dies wird als harter oder abgebrochener Close bezeichnet, da die virtuelle Verbindung des Sockets sofort zurückgesetzt wird und alle nicht gesendeten Daten verlorengehen. Unter Windows schlägt jeder Recv-Aufruf auf der Remoteseite der Verbindung mit WSAECONNRESET fehl.

Wenn der l_onoff Member der linger-Struktur auf ungleich null festgelegt ist und l_linger Member auf ein Timeout ungleich Null für einen blockierenden Socket festgelegt ist, wird der Closesocket-Aufruf blockiert, bis die verbleibenden Daten gesendet wurden oder bis das Timeout abläuft. Dies wird als ordnungsgemäßes Trennen oder Schließen bezeichnet, wenn alle Daten innerhalb des timeoutwerts gesendet werden, der im l_linger-Member angegeben ist. Wenn das Timeout abläuft, bevor alle Daten gesendet wurden, beendet die Windows Sockets-Implementierung die Verbindung, bevor closesocket zurückgegeben wird. Dies wird als harter oder abgebrochener Close bezeichnet.

Das Festlegen des l_onoff Members der linger-Struktur auf ungleich null und das l_linger-Member mit einem Timeoutintervall ungleich null für einen nicht blockierenden Socket wird nicht empfohlen. In diesem Fall schlägt der Aufruf von closesocket mit dem Fehler WSAEWOULDBLOCK fehl, wenn der Schließenvorgang nicht sofort abgeschlossen werden kann. Wenn das Closesocket mit WSAEWOULDBLOCK fehlschlägt, ist das Sockethandle weiterhin gültig, und eine Trennung wird nicht initiiert. Die Anwendung muss closesocket erneut aufrufen, um den Socket zu schließen.

Wenn der l_onoff Member der linger-Struktur ungleich null ist und das l_linger-Member ein Timeoutintervall ungleich 00 eines blockierenden Sockets ist, kann das Ergebnis der Closesocket-Funktion nicht verwendet werden, um zu bestimmen, ob alle Daten an den Peer gesendet wurden. Wenn die Daten gesendet werden, bevor das im l_linger-Member angegebene Timeout abläuft oder die Verbindung abgebrochen wurde, gibt die closesocket-Funktion keinen Fehlercode zurück (der Rückgabewert der closesocket-Funktion ist null).

Der Closesocket-Aufruf wird nur blockiert, bis alle Daten an den Peer übermittelt wurden oder das Timeout abläuft. Wenn die Verbindung zurückgesetzt wird, weil das Timeout abläuft, wechselt der Socket nicht in TIME_WAIT Zustand. Wenn alle Daten innerhalb des Timeoutzeitraums gesendet werden, kann der Socket in TIME_WAIT Zustand wechseln.

Wenn der l_onoff Member der linger-Struktur ungleich null ist und der l_linger Member ein Timeoutintervall von null auf einem blockierenden Socket aufweist, wird die Verbindung durch einen Aufruf von closesocket zurückgesetzt. Der Socket wechselt nicht in den zustand TIME_WAIT.

Die getsockopt-Funktion kann aufgerufen werden, wobei der optname-Parameter auf SO_LINGER festgelegt ist, um den aktuellen Wert der einem Socket zugeordneten linger-Struktur abzurufen.

Hinweis Um sicherzustellen, dass alle Daten über eine Verbindung gesendet und empfangen werden, sollte eine Anwendung das Herunterfahren aufrufen, bevor closesocket aufgerufen wird (weitere Informationen finden Sie unter Ordnungsgemäßes Herunterfahren, Verweiloptionen und Socketabschluss ). Beachten Sie auch, dass ein FD_CLOSE Netzwerkereignis nach dem Aufruf von closesocket nicht gepostet wird.
 

Hier ist eine Zusammenfassung des Closesocket-Verhaltens :

  • Wenn der l_onoff Member der LINGER-Struktur null ist (die Standardeinstellung für einen Socket), wird closesocket sofort zurückgegeben, und die Verbindung wird ordnungsgemäß im Hintergrund geschlossen.
  • Wenn der l_onoff Member der linger-Struktur auf ungleich null festgelegt ist und der l_linger Member auf 0 (kein Timeout) festgelegt ist, wird der Closesocket sofort zurückgegeben, und die Verbindung wird zurückgesetzt oder beendet.
  • Wenn der l_onoff Member der linger-Struktur auf ungleich null festgelegt ist und das l_linger-Element auf ein Timeout ungleich Null festgelegt ist: – Bei einem blockierenden Socket wird das Closesocket blockiert, bis alle Daten gesendet werden oder das Timeout abläuft.

    – Für einen nicht blockierenden Socket gibt closesocket sofort einen Fehler zurück.

Weitere Informationen finden Sie unter Ordnungsgemäßes Herunterfahren, Optionen zum Verweilen und Schließen des Sockets .

Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie closesocket ausstellen, muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Anruf abgeschlossen werden kann. Winsock führt in dieser Situation eine warnbare Wartezeit aus, die durch einen asynchronen Prozeduraufruf (APC) unterbrochen werden kann, der für denselben Thread geplant ist. Das Ausstellen eines weiteren blockierenden Winsock-Aufrufs innerhalb eines APC, der einen fortlaufend blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu undefiniertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 

Hinweise zu IrDA-Sockets

Berücksichtigen Sie Folgendes:

  • Die Headerdatei Af_irda.h muss explizit eingeschlossen werden.
  • Die Standard-Verweiloptionen werden unterstützt.
  • Obwohl IrDA kein ordnungsgemäßes Schließen bereitstellt, verschiebt IrDA das Schließen, bis Empfangswarteschlangen gelöscht werden. Daher kann eine Anwendung Daten senden und sofort die Socketfunktion aufrufen und sicher sein, dass der Empfänger die Daten kopiert, bevor er eine FD_CLOSE Nachricht empfängt.

Hinweise für ATM

Im Folgenden sind wichtige Probleme im Zusammenhang mit dem Verbindungsabbruch bei Verwendung des asynchronen Übertragungsmodus (Asynchroner Übertragungsmodus, ATM) und Windows Sockets 2 aufgeführt:

  • Die Verwendung der Closesocket- oder Herunterfahrfunktionen mit SD_SEND oder SD_BOTH führt dazu, dass ein RELEASE-Signal auf dem Steuerkanal gesendet wird. Aufgrund der Verwendung separater Signal- und Datenkanäle durch atm ist es möglich, dass ein RELEASE-Signal das Remote-Ende erreichen kann, bevor der letzte der Daten sein Ziel erreicht, was zu einem Verlust dieser Daten führt. Eine mögliche Lösung ist die Programmierung einer ausreichenden Verzögerung zwischen den letzten gesendeten Daten und den Aufrufen der Closesocket- oder Shutdown-Funktion für einen ATM-Socket.
  • Das halbe Schließen wird von ATM nicht unterstützt.
  • Sowohl abgebrochene als auch ordnungsgemäße Trennungen führen dazu, dass ein RELEASE-Signal mit demselben Ursachenfeld gesendet wird. In beiden Fällen werden empfangene Daten am Remoteende des Sockets weiterhin an die Anwendung übermittelt. Weitere Informationen finden Sie unter Ordnungsgemäßes Herunterfahren, Linger-Optionen und Socketabschluss .

Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps ab Windows Phone 8 unterstützt.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile winsock2.h (Winsock2.h einschließen)
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

Ordnungsgemäßes Herunterfahren, Verweilen und Schließen des Sockets

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Winsock-Funktionen

Winsock-Referenz

Akzeptieren

getsockopt

ioctlsocket

Verweilen

setsockopt

Socket