LPWSPDUPLICATESOCKET 回呼函式 (ws2spi.h)

LPWSPDuplicateSocket 函式會傳回 WSAPROTOCOL_INFO 結構,可用來建立共用套接字的新套接字描述元。

語法

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

參數

[in] s

本機套接字描述元。

[in] dwProcessId

將使用共用套接字的目標進程標識碼。

[out] lpProtocolInfo

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

[out] lpErrno

錯誤碼的指標。

傳回值

如果沒有發生錯誤,LPWSPDuplicateSocket 會傳回零。 否則,會傳回SOCKET_ERROR的值,而且 lpErrno中提供特定的錯誤號碼。

錯誤碼 意義
WSAENETDOWN
網路子系統失敗。
WSAEINVAL
表示其中一個指定的參數無效。
WSAEINPROGRESS
封鎖 Windows Sockets 呼叫正在進行中,或服務提供者仍在處理回呼函式。
WSAEMFILE
沒有其他套接字描述元可供使用。
WSAENOBUFS
沒有可用的緩衝區空間。 無法建立套接字。
WSAENOTSOCK
描述元不是套接字。

言論

來源進程會呼叫 LPWSPDuplicateSocket,以取得特殊的 WSAPROTOCOL_INFO 結構。 它會使用一些進程間通訊 (IPC) 機制將此結構的內容傳遞至目標進程,進而在呼叫 LPWSPSocket 來取得重複套接字的描述項。 請注意,目標進程只能使用特殊 WSAPROTOCOL_INFO 結構一次。

服務提供者有責任在來源進程內容中執行所需的任何作業,並建立 WSAPROTOCOL_INFO 結構,當它後續顯示為參數,以在目標進程的內容中 LPWSPSocket 時加以辨識。 然後,提供者必須傳回參考通用基礎套接字的套接字描述元。 dwProviderReservedWSAPROTOCOL_INFO 結構的成員可供服務提供者使用,並可用來儲存任何有用的內容資訊,包括重複的句柄。

設定新的套接字描述元時,可安裝的檔案系統 (IFS) 提供者必須呼叫 WPUModifyIFSHandle,且非 IFS 提供者必須呼叫 WPUCreateSocketHandle。 IFS 提供者可以使用 DuplicateHandle 函式。 為了確保套接字重複正常執行,非 IFS 服務提供者必須使用 LPWSPDuplicateSocket 函式。

下列說明在交接模式中建立和使用共用套接字的可能案例。

來源程式 IPC 意義
1) LPWSPSocketLPWSPConnect
2) 要求目標進程識別碼。
==>
3) 接收進程標識碼要求和回應。
4) 接收進程標識碼。
<==
5) 呼叫 **LPWSPDuplicateSocket** 以取得特殊的 WSAPROTOCOL_INFO 結構。
6) 將 WSAPROTOCOL_INFO 結構傳送至目標。
==> 7) 接收 WSAPROTOCOL_INFO 結構。
8) 呼叫 LPWSPSocket,以建立共用套接字描述元。
9) 使用共用套接字進行數據交換。
10) LPWSPCloseSocket
<==

參考共用套接字的描述元可以獨立使用,就 I/O 而言。 不過,Windows Sockets 介面不會實作任何類型的訪問控制,因此,協調其在共用套接字上作業的程式。 共用套接字的一般用法是有一個程式負責建立套接字和建立連線,將套接字交給負責資訊交換的其他進程。

由於重複的內容是套接字描述元,而不是基礎套接字,因此所有描述元之間都會保留與套接字相關聯的所有狀態。 例如,使用一個描述項執行的 WSPSetSockOpt 作業,後續會使用任何或所有描述項 LPWSPGetSockopt 來顯示。 進程可以在重複的套接字上呼叫 LPWSPCloseSocket,而且描述項將會解除分配。 不過,基礎套接字會保持開啟狀態,直到最後一個剩餘描述元呼叫 LPWSPClosesocket 為止。

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

分層服務提供者會提供此函式的實作,但如果呼叫 LPWSPDuplicateSocket 通訊協定鏈結中下一層的 LPWSPDuplicateSocket,它也是此函式的用戶端。 某些特殊考慮適用於此函式的 lpProtocolInfo 參數,因為它會透過通訊協定鏈結的層級向下傳播。

如果通訊協定鏈結中的下一層是另一層,則當下一層的 LPWSPDuplicateSocket 呼叫時,此層必須傳遞至下一層,lpProtocolInfo,該層會參考具有相同未修改鏈結資訊的相同未修改 WSAPROTOCOL_INFO 結構。 不過,如果下一層是基底通訊協定(也就是鏈結中的最後一個專案),則呼叫基底提供者的 LPWSPDuplicateSocket時,此層會執行替代。 在此情況下,基底提供者的 WSAPROTOCOL_INFO 結構應該由 lpProtocolInfo 參數參考。

此原則的一個重要優點是,基礎服務提供者不需要知道通訊協定鏈結。 當透過 LPWSPAddressToStringWSPStartupLPWSPSocketLPWSPStringToAddress等其他函式來傳播 WSAPROTOCOL_INFO 結構時,會套用相同的原則。

要求

要求 價值
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
支援的最低伺服器 Windows 2000 Server [僅限傳統型應用程式]
標頭 ws2spi.h

另請參閱

WPUCreateSocketHandle

WPUModifyIFSHandle