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 的參數時加以辨識。 然後提供者必須傳回參考通用基礎通訊端的通訊端描述元。 WSAPROTOCOL_INFO結構的dwProviderReserved成員可供服務提供者使用,而且可用來儲存任何有用的內容資訊,包括重複的控制碼。

配置新的通訊端描述元時,可安裝的檔案系統 (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 ,也是此函式的用戶端。 某些特殊考慮適用于此函式的 lpProtocolInfo 參數,因為它會透過通訊協定鏈結的層傳播。

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

此原則的其中一個重要優點是基底服務提供者不需要注意通訊協定鏈結。 此相同原則適用于透過LPWSPAddressToStringWSPStartupLPWSPSocketLPWSPStringToAddress等其他函式分層序列傳播WSAPROTOCOL_INFO結構時。

規格需求

   
最低支援的用戶端 Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限傳統型應用程式]
標頭 ws2spi.h

另請參閱

WPUCreateSocketHandle

WPUModifyIFSHandle