WSADuplicateSocketW 函式 (winsock2.h)

WSADuplicateSocket 函式會傳回WSAPROTOCOL_INFO結構,可用來建立共用套接字的新套接字描述項。 WSADuplicateSocket 函式無法在啟用 QOS 的套接字上使用。

語法

int WSAAPI WSADuplicateSocketW(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo
);

參數

[in] s

識別本機套接字的描述項。

[in] dwProcessId

將使用重複套接字之目標進程的進程標識碼。

[out] lpProtocolInfo

用戶端所配置的緩衝區指標,足以包含 WSAPROTOCOL_INFO 結構。 服務提供者會將通訊協定資訊結構內容複製到這個緩衝區。

傳回值

如果沒有發生錯誤, WSADuplicateSocket 會傳回零。 否則,會傳回SOCKET_ERROR的值,並呼叫 WSAGetLastError 來擷取特定的錯誤碼。

錯誤碼 意義
WSANOTINITIALISED
使用這個函式之前,必須先進行成功的 WSAStartup 呼叫。
WSAENETDOWN
網路子系統失敗。
WSAEINVAL
表示其中一個指定的參數無效。
WSAEINPROGRESS
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或服務提供者仍在處理回呼函式。
WSAEMFILE
不再有可用的通訊端描述項。
WSAENOBUFS
沒有可用的緩衝區空間。 無法建立套接字。
WSAENOTSOCK
描述項不是套接字。
WSAEFAULT
lpProtocolInfo 參數不是用戶位址空間的有效部分。

備註

WSADuplicateSocket 函式可用來啟用進程之間的套接字共用。 來源進程會呼叫 WSADuplicateSocket 來取得特殊的 WSAPROTOCOL_INFO 結構。 它會使用一些進程間通訊 (IPC) 機制,將此結構的內容傳遞至目標進程,進而在 WSASocket 的呼叫中使用它來取得重複套接字的描述符。 特殊 WSAPROTOCOL_INFO 結構只能由目標進程使用一次。

套接字可以在指定進程中的線程之間共用,而不使用 WSADuplicateSocket 函式,因為套接字描述項在進程的所有線程中都是有效的。

下表說明建立和遞交共用套接字的一個可能案例。

來源程序 IPC 目的地處理序
1) WSASocketWSAConnect
2) 要求目標進程標識碼 ==>
3) 接收進程標識碼要求和回應
4) 接收進程標識碼 <==
5) 呼叫 WSADuplicateSocket 以取得特殊的 WSAPROTOCOL_INFO 結構
6) 將 WSAPROTOCOL_INFO 結構傳送至目標
==> 7) 接收 WSAPROTOCOL_INFO 結構
8) 呼叫 WSASocket 以建立共用套接字描述項。
9) 使用共用套接字進行數據交換
10) closesocket <==
 

參考共用套接字的描述項可以獨立用於 I/O。 不過,Windows Sockets 介面不會實作任何類型的訪問控制,因此它取決於協調其在共用套接字上作業的程式。 共用套接字通常用來擁有一個負責建立套接字和建立連線的程式,以及負責資訊交換的其他進程。

與套接字相關聯的所有狀態資訊會保留在所有描述項的通用狀態資訊,因為套接字描述項重複,而不是實際的套接字。 例如,使用一個描述項執行的 setockopt 作業後續會使用任何或所有描述項的 getsockopt 來顯示。 來源進程和目的地進程都應該將相同的旗標傳遞至其各自的 WSASocket 函式呼叫。 如果來源進程使用套接字函式來建立 套接字 ,目的地進程必須將 WSA_FLAG_OVERLAPPED 旗標傳遞至其 WSASocket 函數調用。 進程可以在重複的套接字上呼叫 closesocket ,而且描述項將會解除分配。 不過,基礎套接字會保持開啟狀態,直到最後剩餘的描述項呼叫 closesocket 為止。

共用套接字上的通知受限於 WSAAsyncSelectWSAEventSelect 的一般條件約束。 使用任何共用描述項發出其中一個呼叫,會取消套接字的任何先前事件註冊,而不論使用哪一個描述元進行該註冊。 因此,共用套接字無法傳遞FD_READ事件來處理 A,並FD_WRITE事件來處理 B。對於需要這類緊密協調的情況,建議開發人員使用線程,而不是個別的進程。

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

注意

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

另請參閱

WSASocket

Winsock 函式

Winsock 參考