Freigeben über


closesocket-Funktion (winsock.h)

Die Closesocket-Funktion schließt einen vorhandenen Socket.

Syntax

int 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
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEINTR
Der (blockierende) Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.
WSAEWOULDBLOCK
Der Socket ist als nonblocking gekennzeichnet, aber das l_onoff Member der linger-Struktur ist auf nonzero festgelegt, und das l_linger Member der linger-Struktur ist auf einen Wert ohne Zero-Timeout 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 im s-Parameter übergebene Socketdeskriptor sofort vom System wiederverwendet wird, sobald die Closesocket-Funktion ausgegeben wird. Daher ist es nicht zuverlässig zu erwarten, dass weitere Verweise auf die Socketdeskriptor, die im s-Parameter übergeben werden, mit dem Fehler WSAENOTSOCK fehlschlagen. Ein Winsock-Client darf niemals closesocket on s gleichzeitig mit einem anderen Winsock-Funktionsaufruf ausstellen.

Alle ausstehenden überlappenden Sende- und Empfangsvorgänge (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 Vervollständigungsportaktionen, 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 das Closesocket zurückgibt. Die Closesocket-Funktion initiiert den Abbruch für die 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 zum Schließen von Sockets 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 angibt, wie sich dieser Socket verhalten soll, wenn Daten gesendet werden sollen und die Closesocket-Funktion im 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 der 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 l_onoff - als auch l_linger-Member geändert werden.

Das l_linger Member der linger-Struktur bestimmt, wie lange ein Socket in Sekunden geöffnet bleiben soll. Dieses Element ist nur anwendbar, wenn das l_onoff Member der linger-Struktur nichtzero ist.

Die Standardparameter für einen Socket sind der 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, 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 Nichtzero-Wert festlegen und den l_linger-Member auf das gewünschte Timeout in Sekunden festlegen. Um zu deaktivieren, dass ein Socket geöffnet bleibt, muss eine Anwendung nur den l_onoff Member der linger-Struktur auf 0 festlegen.

Wenn eine Anwendung die setockopt-Funktion aufruft , wobei der optname-Parameter auf SO_DONTLINGER festgelegt ist, um das l_onoff-Member auf einen nonzero-Wert festzulegen, wird der Wert für das 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 auf SO_LINGER), sollte dieser Timeoutwert vom Dienstanbieter wiederhergestellt werden.

Die Semantik der Closesocket-Funktion wird durch die Socketoptionen beeinflusst, die Elemente der linger-Struktur festlegen.

l_onoff l_linger Art des Schließens Warten Sie auf schließen?
Null Egal Anmutiger 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 das l_onoff Member der LINGER-Struktur in einem Datenstromsocket null ist, wird der Closesocket-Aufruf sofort zurückgegeben und erhält WSAEWOULDBLOCK nicht, unabhängig davon, ob der Socket blockiert oder nicht blockiert. Alle Daten, die für die Übertragung in die Warteschlange gestellt werden, 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 das l_onoff Member der linger-Struktur nonzero ist und l_linger Member 0 ist, wird closesocket auch dann nicht blockiert, wenn die Daten in der Warteschlange noch nicht gesendet oder bestätigt wurden. Dies wird als hartes oder abgebrochenes Schließen bezeichnet, da die virtuelle Verbindung des Sockets sofort zurückgesetzt wird und alle nicht gesendeten Daten verloren gegangen sind. Unter Windows schlägt jeder Recv-Aufruf auf der Remoteseite der Leitung mit WSAECONNRESET fehl.

Wenn das l_onoff Member der linger-Struktur auf nonzero festgelegt ist und l_linger Member auf ein nonzero timeout für einen blockierenden Socket festgelegt ist, wird der Closesocket-Aufruf blockiert, bis die restlichen Daten gesendet wurden oder bis das Timeout abläuft. Dies wird als ordnungsgemäße Trennung 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 hartes oder abgebrochenes Schließen bezeichnet.

Das Festlegen des l_onoff Members der linger-Struktur auf nonzero und das l_linger-Member mit einem Timeoutintervall nonzero auf einem 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 das l_onoff Member der linger-Struktur nichtzero ist und das l_linger-Member ein Timeoutintervall ohne Zero auf einem blockierenden Socket 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 wenn die Verbindung abgebrochen wurde, gibt die Closesocket-Funktion keinen Fehlercode zurück (der Rückgabewert der Closesocket-Funktion ist 0).

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, wird der Socket nicht in TIME_WAIT Zustand versetzt. Wenn alle Daten innerhalb des Timeoutzeitraums gesendet werden, kann der Socket in TIME_WAIT Zustand versetzt werden.

Wenn das l_onoff Member der linger-Struktur nichtzero ist und das 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 TIME_WAIT Zustand.

Die getockopt-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 Graceful shutdown, linger options, and socket closure ). Beachten Sie außerdem, dass ein FD_CLOSE Netzwerkereignis nach dem Aufruf von closesocket nicht gepostet wird.
 

Hier finden Sie eine Zusammenfassung des Closesocket-Verhaltens :

  • Wenn der l_onoff Member der LINGER-Struktur 0 ist (Standard für einen Socket), wird closesocket sofort zurückgegeben, und die Verbindung wird im Hintergrund ordnungsgemäß geschlossen.
  • Wenn das l_onoff Member der linger-Struktur auf nonzero festgelegt ist und das l_linger Member auf Null (kein Timeout) festgelegt ist, wird das Closesocket sofort zurückgegeben, und die Verbindung wird zurückgesetzt oder beendet.
  • Wenn das l_onoff Member der linger-Struktur auf nonzero festgelegt ist und der l_linger Member auf ein timeout nonzero festgelegt ist: – Für einen blockierenden Socket schließen Sie die Sperre , bis alle Daten gesendet werden oder das Timeout abläuft.

    – Für einen nicht blockierenden Socket gibt closesocket sofort zurück, was auf einen Fehler hinweist.

Weitere Informationen finden Sie unter Graceful Shutdown, Linger-Optionen und Socket-Verschluss .

Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie closesocket ausgeben, 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 Ausgeben eines weiteren blockierenden Winsock-Aufrufs in einem APC, der einen fortlaufenden blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu nicht definiertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 

Hinweise zu IrDA-Sockets

Berücksichtigen Sie Folgendes:

  • Die Af_irda.h-Headerdatei muss explizit enthalten sein.
  • Die Standard-Verweiloptionen werden unterstützt.
  • Obwohl IrDA keinen ordnungsgemäßen Abschluss bereitstellt, wird das Schließen von IrDA zurückgehalten, 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 Shutdown-Funktionen 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 das letzte der Daten sein Ziel erreicht, was zu einem Verlust dieser Daten führt. Eine mögliche Lösung ist das Programmieren 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 Ursachefeld gesendet wird. In beiden Fällen werden empfangene Daten am Remoteende des Sockets weiterhin an die Anwendung übermittelt. Weitere Informationen finden Sie unter Graceful Shutdown, Linger-Optionen und Socket Closure .

Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.

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

Anforderungen

Anforderung Wert
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 winsock.h (einschließlich Winsock2.h)
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

Graceful Shutdown, Linger-Optionen und Socket Closure

WSAAsyncWählen

WSADuplicateSocket

WSAOVERLAPED

Winsock-Funktionen

Winsock-Referenz

Akzeptieren

getsockopt

ioctlsocket

Verweilen

setsockopt

Socket