Share via


LPWSPCLOSESOCKET-Rückruffunktion (ws2spi.h)

Die LPWSPCloseSocket-Funktion schließt einen Socket.

Syntax

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

Parameter

[in] s

Deskriptor, der einen Socket identifiziert.

[out] lpErrno

Zeiger auf den Fehlercode.

Rückgabewert

Wenn kein Fehler auftritt, gibt LPWSPCloseSocket null zurück. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode ist in lpErrno verfügbar.

Fehlercode Bedeutung
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAEINPROGRESS
Der Windows Sockets-Aufruf wird blockiert, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEWOULDBLOCK
Socket ist als nicht blockierend gekennzeichnet, und SO_LINGER ist auf einen Timeoutwert ohne Zero festgelegt.

Hinweise

Diese Funktion schließt einen Socket. Genauer gesagt gibt es den Socketdeskriptor s frei, sodass weitere Verweise auf s mit dem Fehler WSAENOTSOCK fehlschlagen sollten. Wenn dies der letzte Verweis auf einen zugrunde liegenden Socket ist, werden die zugeordneten Benennungsinformationen und die daten in der Warteschlange verworfen. Alle blockierenden oder asynchronen Aufrufe, die für den Socket ausstehen (von einem beliebigen Thread in diesem Prozess ausgegeben) werden abgebrochen, ohne Benachrichtigungen zu veröffentlichen. Alle ausstehenden überlappenden Vorgänge, die von einem beliebigen Thread in diesem Prozess ausgegeben werden, werden ebenfalls abgebrochen. Die für diese überlappenden Vorgänge angegebene Vervollständigungsaktion wird ausgeführt (z. B. Ereignis, Vervollständigungsroutine oder Vervollständigungsport). In diesem Fall schlagen die ausstehenden überlappenden Vorgänge mit dem Fehler status WSA_OPERATION_ABORTED fehl. FD_CLOSE werden nach dem Aufruf von LPWSPCloseSocket nicht veröffentlicht.

Das LPWSPCloseSocket-Verhalten wird wie folgt zusammengefasst:

  • Wenn SO_DONTLINGER aktiviert ist (die Standardeinstellung), wird LPWSPCloseSocket sofort zurückgegeben, und die Verbindung wird im Hintergrund ordnungsgemäß geschlossen.

  • Wenn SO_LINGER mit einem Nulltimeout aktiviert ist, wird LPWSPCloseSocket sofort zurückgegeben, und die Verbindung wird zurückgesetzt/beendet.

    oder

  • Wenn SO_LINGER mit einem nonzero-Timeout mit einem blockierenden Socket aktiviert ist, blockiert LPWSPCloseSocket , bis alle Daten gesendet werden oder das Timeout abläuft.

  • Wenn SO_LINGER mit einem nonzero-Timeout mit einem nicht blockierenden Socket aktiviert ist, wird LPWSPCloseSocket sofort zurückgegeben, was einen Fehler anzeigt.

Die Semantik von LPWSPCloseSocket wird durch die Socketoptionen SO_LINGER und SO_DONTLINGER wie folgt beeinflusst.

Option Intervall Art des Schließens Warten Sie auf schließen?
SO_DONTLINGER Egal Ordnungsgemäß No
SO_LINGER Null Schwierig No
SO_LINGER Nonzero Ordnungsgemäß Yes

 

 

Wenn SO_LINGER festgelegt ist (d. h. das l_onoff Member der linger-Struktur ist nonzero) und das Timeoutintervall l_linger null ist, wird LPWSPCloseSocket nicht blockiert, auch wenn noch keine Daten in der Warteschlange 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. Jeder LPWSPRecv-Aufruf auf der Remoteseite der Leitung schlägt mit WSAECONNRESET fehl.

Wenn SO_LINGER auf einem blockierenden Socket mit einem Timeoutintervall ohne Zero festgelegt ist, blockiert der LPWSPCloseSocket-Aufruf auf einem blockierenden Socket, bis die restlichen Daten gesendet wurden oder bis das Timeout abläuft. Dies wird als ordnungsgemäße Trennung bezeichnet. Wenn das Timeout abläuft, bevor alle Daten gesendet wurden, sollte der Dienstanbieter die Verbindung beenden, bevor LPWSPCloseSocket zurückgibt.

Das Aktivieren SO_LINGER mit einem Timeoutintervall ohne Zero auf einem nicht blockierenden Socket wird nicht empfohlen. In diesem Fall schlägt der Aufruf von LPWSPCloseSocket mit dem Fehler WSAEWOULDBLOCK fehl, wenn der Schließenvorgang nicht sofort abgeschlossen werden kann. Wenn LPWSPCloseSocket mit WSAEWOULDBLOCK fehlschlägt, ist das Sockethandle weiterhin gültig, und eine Trennung wird nicht initiiert.

Der Winsock SPI-Client muss LPWSPCloseSocket erneut aufrufen, um den Socket zu schließen, obwohl LPWSPCloseSocket weiterhin fehlschlagen kann, es sei denn, der Winsock SPI-Client führt eine der folgenden Aktionen aus:

  • Deaktiviert SO_DONTLINGER.
  • Aktiviert SO_LINGER mit einem Nulltimeout.
  • Ruft LPWSPShutdown auf, um das Schließen zu initiieren.

Wenn SO_DONTLINGER auf einem Streamsocket festgelegt ist (d. h. das l_onoff Member der linger-Struktur ist 0), wird der LPWSPCloseSocket-Aufruf sofort zurückgegeben und erhält 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 als ordnungsgemäße Trennung bezeichnet und ist das Standardverhalten.

Beachten Sie, dass in diesem Fall der Winsock-Anbieter alle Ressourcen behalten darf, die dem Socket zugeordnet sind, bis die ordnungsgemäße Trennung abgeschlossen ist oder der Anbieter die Verbindung beendet, da der Vorgang nicht in einer vom Anbieter bestimmten Zeit abgeschlossen werden kann. Dies kann sich auf Winsock-Clients auswirken, die erwarten, alle verfügbaren Sockets zu verwenden. Dies ist das Standardverhalten. SO_DONTLINGER ist standardmäßig festgelegt.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Kopfzeile ws2spi.h

Weitere Informationen

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket