共用方式為


共用套接字

引進 WSADuplicateSocket 函式,以啟用跨進程的套接字共用。 來源進程會呼叫 WSADuplicateSocket,以取得目標進程標識碼的特殊 WSAPROTOCOL_INFO 結構。 它會使用一些進程間通訊 (IPC) 機制,將此結構的內容傳遞至目標進程。 然後,目標行程會使用 呼叫中的 WSAPROTOCOL_INFO 結構,WSPSocket。 此函式傳回的套接字描述元將會是基礎套接字的額外套接字描述元,因此會變成共用。 套接字可以在指定進程中的線程之間共用,而不需要使用 WSADuplicateSocket 函式,因為套接字描述元在進程的所有線程中都是有效的。

參考共用套接字的兩個(或更多)描述元可以獨立使用,就 I/O 而言。 不過,Winsock 介面不會實作任何類型的訪問控制,因此進程必須協調共用套接字上的任何作業。 共用套接字的一個典型範例是使用一個程式來建立套接字和建立連線。 接著,此程式會將套接字移出給負責資訊交換的其他進程。

WSADuplicateSocket 函式會建立套接字描述元,而不是基礎套接字。 如此一來,所有與套接字相關聯的狀態都會在所有描述元中共同保存。 例如,使用一個描述項執行的 setsockopt 作業,後續會使用任何或所有描述項的 getsockopt 來顯示。 進程可以在重複的套接字上呼叫 closesocket,而且描述項將會解除分配。 不過,基礎套接字會保持開啟狀態,直到 closesocket 使用最後一個剩餘的描述元呼叫為止。

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