WSADuplicateSocketA 函式 (winsock2.h)
WSADuplicateSocket函式會傳回WSAPROTOCOL_INFO結構,可用來建立共用通訊端的新通訊端描述元。 WSADuplicateSocket函式無法在啟用 QOS 的通訊端上使用。
語法
int WSAAPI WSADuplicateSocketA(
[in] SOCKET s,
[in] DWORD dwProcessId,
[out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);
參數
[in] s
識別本機通訊端的描述項。
[in] dwProcessId
將使用重複通訊端之目標進程的進程識別碼。
[out] lpProtocolInfo
用戶端所配置的緩衝區指標,足以包含 WSAPROTOCOL_INFO 結構。 服務提供者會將通訊協定資訊結構內容複寫到這個緩衝區。
傳回值
如果沒有發生錯誤, WSADuplicateSocket 會傳回零。 否則,會傳回SOCKET_ERROR的值,而且可以呼叫 WSAGetLastError來擷取特定的錯誤碼。
錯誤碼 | 意義 |
---|---|
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。 | |
網路子系統失敗。 | |
表示其中一個指定的參數無效。 | |
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或者服務提供者仍在處理回呼函式。 | |
不再有可用的通訊端描述項。 | |
沒有可用的緩衝區空間。 無法建立通訊端。 | |
描述項不是通訊端。 | |
lpProtocolInfo參數不是使用者位址空間的有效部分。 |
備註
WSADuplicateSocket函式可用來啟用進程之間的通訊端共用。 來源進程會呼叫 WSADuplicateSocket ,以取得特殊的 WSAPROTOCOL_INFO 結構。 它會使用一些處理序間通訊 (IPC) 機制,將此結構的內容傳遞至目標進程,進而在呼叫 WSASocket 中使用它來取得重複通訊端的描述元。 特殊 WSAPROTOCOL_INFO 結構只能由目標進程使用一次。
通訊端可以在給定進程中的執行緒之間共用,而不使用 WSADuplicateSocket 函式,因為通訊端描述元在進程的所有線程中都是有效的。
下表說明建立和遞交共用通訊端的一個可能案例。
來源程序 | IPC | 目的地處理序 |
---|---|---|
1) WSASocket、 WSAConnect | ||
2) 要求目標進程識別碼 | ==> | |
3) 接收進程識別碼要求和回應 | ||
4) 接收進程識別碼 | <== | |
5) 呼叫 WSADuplicateSocket 以取得特殊的 WSAPROTOCOL_INFO 結構 | ||
6) 將 WSAPROTOCOL_INFO 結構傳送至目標 | ||
==> | 7) 接收 WSAPROTOCOL_INFO 結構 | |
8) 呼叫 WSASocket 以建立共用通訊端描述元。 | ||
9) 使用共用通訊端進行資料交換 | ||
10) closesocket | <== |
參考共用通訊端的描述項可以單獨用於 I/O。 不過,Windows Sockets 介面不會實作任何類型的存取控制,因此,它取決於協調共用通訊端上作業的程式。 共用通訊端通常用來擁有一個負責建立通訊端和建立連線的程式,以及負責資訊交換的其他進程。
所有與通訊端相關聯的狀態資訊都會保留在所有描述項的通用狀態資訊,因為通訊端描述元重複,而不是實際的通訊端。 例如,使用一個描述元執行的 setockopt 作業接著會使用任何或所有描述元的 取得ockopt 來顯示。 來源進程和目的地進程都應該將相同的旗標傳遞至各自的 WSASocket 函式呼叫。 如果來源進程使用通訊端函式來建立 通訊端 ,目的地進程必須將 WSA_FLAG_OVERLAPPED 旗標傳遞至其 WSASocket 函式呼叫。 進程可以在重複的通訊端上呼叫 closesocket ,而且描述項將會解除配置。 不過,基礎通訊端會保持開啟狀態,直到最後一個剩餘的描述元呼叫 closesocket 為止。
共用通訊端上的通知受限於 WSAAsyncSelect 和 WSAEventSelect的一般條件約束。 使用任何共用描述項發出其中一個呼叫,會取消通訊端的任何先前事件註冊,不論使用哪一個描述元進行該註冊。 因此,共用通訊端無法傳遞FD_READ事件來處理 A,以及FD_WRITE事件來處理 B。對於需要這類緊密協調的情況,建議開發人員使用執行緒,而不是個別的程式。
Windows 8.1和Windows Server 2012 R2:Windows 市集應用程式支援WSADuplicateSocketW函式,Windows 8.1、Windows Server 2012 R2 及更新版本。
注意
winsock2.h 標頭會根據 UNICODE 預處理器常數的定義,將 WSADuplicateSocket 定義為別名,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例。
規格需求
最低支援的用戶端 | Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | winsock2.h |
程式庫 | Ws2_32.lib |
Dll | Ws2_32.dll |