LPFN_DISCONNECTEX回呼函式 (mswsock.h)

DisconnectEx 函式會關閉套接字上的連線,並允許重複使用套接字句柄。

注意

此函式是 Windows Sockets 規格的 Microsoft 特定擴充功能。

語法

LPFN_DISCONNECTEX LpfnDisconnectex;

BOOL LpfnDisconnectex(
  SOCKET s,
  LPOVERLAPPED lpOverlapped,
  DWORD dwFlags,
  DWORD dwReserved
)
{...}

參數

s

連接的連接導向套接字句柄。

lpOverlapped

重疊結構的指標。 如果套接字句柄已開啟為重疊,指定此參數會導致重疊的 (異步) I/O 作業。

dwFlags

一組旗標,可自定義函數調用的處理。 當此參數設定為零時,不會設定任何旗標。 dwFlags 參數可以有下列值。

旗標 意義
TF_REUSE_SOCKET 準備要重複使用的套接字句柄。 當 DisconnectEx 要求完成時,套接字句柄可以傳遞至 AcceptExConnectEx 函式。
注意: 套接字層級中斷連線受限於基礎傳輸的行為。 例如,TCP 套接字可能會受到 TCP TIME_WAIT狀態,導致 DisconnectEx 呼叫延遲。

dwReserved

保留的。 必須為零。 如果為非零,則會傳回 WSAEINVAL

傳回值

成功時, DisconnectEx 函 式會傳回 TRUE。 失敗時,函式會傳回 FALSE。 使用 WSAGetLastError 函 式來取得擴充的錯誤資訊。 如果 呼叫 WSAGetLastError 函 式傳回 ERROR_IO_PENDING,作業就會成功起始,且正在進行中。 在這種情況下,當作業完成時,呼叫仍可能會失敗。

錯誤碼 描述
WSAEFAULT 系統在嘗試使用指標自變數時偵測到無效的指標位址。 如果在 lpOverlapped 參數中傳遞無效的指標值,就會傳回此錯誤。
WSAEINVAL 傳遞了無效的參數。 如果 dwFlags 參數是以 TF_REUSE_SOCKET以外的零值指定,則會傳回此錯誤。
WSAENOTCONN 未連接此通訊端。 如果套接字 s 參數不是處於連線狀態,就會傳回此錯誤。 如果套接字處於先前要求的傳輸關閉狀態,而且 dwFlags 參數未設定為 TF_REUSE_SOCKET 要求重複使用套接字,也可以傳回此錯誤。

備註

DisconnectEx 函式不支持數據報套接字。 因此, hSocket 指定的套接字必須是連線導向的,例如SOCK_STREAM、SOCK_SEQPACKET或SOCK_RDM套接字。

注意

DisconnectEx 函式的函式指標必須在運行時間取得,方法是呼叫 WSAIoctl 函式並指定 SIO_GET_EXTENSION_FUNCTION_POINTER opcode。 傳遞至 WSAIoctl 函式的輸入緩衝區必須包含 WSAID_DISCONNECTEX,這是全域唯一標識碼 (GUID) ,其值會識別 DisconnectEx 延伸模組函式。 成功時, WSAIoctl 函式傳回的輸出會包含 DisconnectEx 函 式的指標。 WSAID_DISCONNECTEX GUID 定義於 Mswsock.h 頭檔中。

lpOverlapped 不是 NULL 時,重疊的 I/O 可能無法在 DisconnectEx 傳回之前完成,導致 DisconnectEx 函式傳回 FALSE,並呼叫傳回ERROR_IO_PENDINGWSAGetLastError 函式。 此設計可讓呼叫端在中斷連線作業完成時繼續處理。 完成要求時,Windows 會將重疊結構的 hEvent 成員或 hSocket 指定的套接字所指定的事件設定為已發出訊號的狀態。

注意

當該線程結束時,指定的線程所起始的所有 I/O 都會取消。 對於重疊的套接字,如果線程在作業完成之前關閉,擱置的異步操作可能會失敗。 如需詳細資訊,請參閱 ExitThread

TIME_WAIT狀態會決定 TCP 釋放已關閉連線並重複使用其資源之前必須經過的時間。 關閉和釋放之間的這個間隔稱為TIME_WAIT狀態或 2MSL 狀態。 在這段期間,重新開啟連線的成本比建立新的連線還少。 TIME_WAIT行為是在 RFC 793 中指定,這需要 TCP 至少在網路 (MSL) 兩倍的間隔內維護封閉式連線。 發行連線時,其套接字配對和用於套接字的內部資源可用來支援另一個連線。

Windows TCP 會在連線關閉之後還原為TIME_WAIT狀態。 處於TIME_WAIT狀態時,無法重複使用套接字組。 TIME_WAIT期間可透過修改下列 DWORD 登錄設定,以秒為單位來代表TIME_WAIT期間。

\ HKEY_LOCAL_MACHINE系統\CurrentControlSet\服務\TCPIP\參數\TcpTimedWaitDelay

根據預設,MSL 定義為 120 秒。 TcpTimedWaitDelay 登錄設定預設為值 240 秒,代表 120 秒或 4 分鐘的最大區段存留期 2 倍。 不過,您可以使用這個項目來自定義間隔。 減少這個專案的值可讓 TCP 更快速地釋放關閉的連線,為新的連線提供更多資源。 不過,如果值太低,TCP 可能會在連線完成之前釋出連線資源,要求伺服器使用其他資源重新建立連線。 此登錄設定可以從 0 設定為 300 秒。

Windows Phone 8:Windows Phone Windows Phone 8 和更新版本上的市集應用程式支援此函式。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更新版本上的 Windows 市集應用程式支援此函式。

規格需求

需求
標頭 mswsock.h