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中提供特定的錯誤號碼。
錯誤碼 | 意義 |
---|---|
網路子系統失敗。 | |
表示其中一個指定的參數無效。 | |
封鎖 Windows Sockets 呼叫正在進行中,或服務提供者仍在處理回呼函式。 | |
沒有其他套接字描述元可供使用。 | |
沒有可用的緩衝區空間。 無法建立套接字。 | |
描述元不是套接字。 |
言論
來源進程會呼叫 LPWSPDuplicateSocket,以取得特殊的 WSAPROTOCOL_INFO 結構。 它會使用一些進程間通訊 (IPC) 機制將此結構的內容傳遞至目標進程,進而在呼叫 LPWSPSocket 來取得重複套接字的描述項。 請注意,目標進程只能使用特殊 WSAPROTOCOL_INFO 結構一次。
服務提供者有責任在來源進程內容中執行所需的任何作業,並建立 WSAPROTOCOL_INFO 結構,當它後續顯示為參數,以在目標進程的內容中 LPWSPSocket 時加以辨識。 然後,提供者必須傳回參考通用基礎套接字的套接字描述元。 dwProviderReservedWSAPROTOCOL_INFO 結構的成員可供服務提供者使用,並可用來儲存任何有用的內容資訊,包括重複的句柄。
設定新的套接字描述元時,可安裝的檔案系統 (IFS) 提供者必須呼叫 WPUModifyIFSHandle,且非 IFS 提供者必須呼叫 WPUCreateSocketHandle。 IFS 提供者可以使用 DuplicateHandle 函式。 為了確保套接字重複正常執行,非 IFS 服務提供者必須使用 LPWSPDuplicateSocket 函式。
下列說明在交接模式中建立和使用共用套接字的可能案例。
來源程式 | IPC | 意義 |
---|---|---|
|
==> | |
|
3) 接收進程標識碼要求和回應。 | |
|
<== | |
|
||
|
||
|
==> | 7) 接收 WSAPROTOCOL_INFO 結構。 |
|
8) 呼叫 LPWSPSocket,以建立共用套接字描述元。 | |
|
9) 使用共用套接字進行數據交換。 | |
|
<== |
參考共用套接字的描述元可以獨立使用,就 I/O 而言。 不過,Windows Sockets 介面不會實作任何類型的訪問控制,因此,協調其在共用套接字上作業的程式。 共用套接字的一般用法是有一個程式負責建立套接字和建立連線,將套接字交給負責資訊交換的其他進程。
由於重複的內容是套接字描述元,而不是基礎套接字,因此所有描述元之間都會保留與套接字相關聯的所有狀態。 例如,使用一個描述項執行的 WSPSetSockOpt 作業,後續會使用任何或所有描述項 LPWSPGetSockopt 來顯示。 進程可以在重複的套接字上呼叫 LPWSPCloseSocket,而且描述項將會解除分配。 不過,基礎套接字會保持開啟狀態,直到最後一個剩餘描述元呼叫 LPWSPClosesocket 為止。
共用套接字上的通知受限於 LPWSPAsyncSelect 和 LPWSPEventSelect的一般條件約束。 使用任何共用描述元發出上述任一呼叫,會取消套接字的任何先前事件註冊,而不論使用哪個描述元來進行該註冊。 因此,例如,共用套接字無法傳遞FD_READ事件來處理 A,並FD_WRITE事件來處理 B。針對需要如此緊密協調的情況,建議開發人員使用線程,而不是個別的程式。
分層服務提供者會提供此函式的實作,但如果呼叫 LPWSPDuplicateSocket 通訊協定鏈結中下一層的 LPWSPDuplicateSocket,它也是此函式的用戶端。 某些特殊考慮適用於此函式的 lpProtocolInfo 參數,因為它會透過通訊協定鏈結的層級向下傳播。
如果通訊協定鏈結中的下一層是另一層,則當下一層的 LPWSPDuplicateSocket 呼叫時,此層必須傳遞至下一層,lpProtocolInfo,該層會參考具有相同未修改鏈結資訊的相同未修改 WSAPROTOCOL_INFO 結構。 不過,如果下一層是基底通訊協定(也就是鏈結中的最後一個專案),則呼叫基底提供者的 LPWSPDuplicateSocket時,此層會執行替代。 在此情況下,基底提供者的 WSAPROTOCOL_INFO 結構應該由 lpProtocolInfo 參數參考。
此原則的一個重要優點是,基礎服務提供者不需要知道通訊協定鏈結。 當透過 LPWSPAddressToString、WSPStartup、LPWSPSocket或 LPWSPStringToAddress等其他函式來傳播 WSAPROTOCOL_INFO 結構時,會套用相同的原則。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
支援的最低伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
標頭 | ws2spi.h |