共用方式為


複製 SAN 的通訊端控制碼

在不同進程中執行的多個應用程式可以使用 Windows Sockets 參數,在共用基礎通訊端上執行作業。 不過,一次只能有一個應用程式在該共用基礎通訊端上執行作業。

若要使用共用基礎通訊端,應用程式必須以下列其中一種方式擷取該基礎通訊端的重複控制碼:

  • 直接呼叫 Windows Sockets WSADuplicateSocket 函式

    呼叫是在控制進程的內容中進行, (建立通訊端的進程) 。

  • 間接呼叫 Win32 DuplicateHandle 函式

    呼叫是在非控制進程的內容中進行, (不是建立通訊端的進程) 。

  • 使用控制碼繼承機制

    子進程 (非控制進程) 繼承在其父進程中建立的所有或部分控制碼, (控制進程) 。

  • 在正常連線關閉期間

    如果控制程式中的應用程式關閉通訊端並結束,而某些資料仍會繼續傳送,則此剩餘的資料會在 Windows 通訊端 DLL 中緩衝處理。 系統服務進程內容中的另一個應用程式 (非控制進程) 後續傳送此資料。

Windows Sockets 參數會與 TCP/IP 提供者搭配使用,偵測並處理上述每個條件。 交換器一次只允許一個進程執行可傳輸資料或變更基礎共用通訊端狀態的作業。 視需要處理動態交換基礎通訊端的控制,以執行要求的作業。 參數會序列化不同進程要求在共用通訊端上執行的作業,並以先出先出 (FIFO) 循序執行這些作業。 交換器會等候所有進行中的作業完成,再將基礎通訊端的控制權交換至另一個進程。 在邏輯上,當非控制進程要求合格作業時,交換器就會將基礎通訊端的控制權與控制進程分開。 取下控制權之後,如果原始控制程式要求合格的作業,參數會將原始控制程式視為非控制進程。 請注意,參數在重複通訊端控制碼上不會採取任何動作,直到非控制進程實際對資料傳輸或狀態變更作業使用重複的通訊端控制碼為止。

交換器和適當的 SAN 服務提供者都會載入共用特定基礎通訊端存取權的所有進程。 交換器會在共用通訊端的所有進程中維護自己的通訊端內容和線上狀態資訊。 SAN 服務提供者必須維護其通訊端內容和線上狀態資訊,只在具有任何指定時間點之基礎通訊端控制權的進程中。 每當交換器需要交換時,SAN 服務提供者必須交換其內容和線上狀態資訊,從目前的控制程式到下一個控制進程,如下列順序所述。 若要將結算所需的資源數量降到最低,SAN 服務提供者可以在共用基礎通訊端的所有進程中維護其內容和線上狀態資訊。

因為交換器不會建立對應至應用程式通訊端的 SAN 通訊端,直到應用程式呼叫 connect 或 listen 函式為止,交換器無法要求 SAN 服務提供者在連接或接 應用程式通訊端之前執行交換作業。 即使在連接或接聽應用程式通訊端之後,在交換器要求 SAN 服務提供者交換控制通訊端之前,必須符合下列其中一個條件:

  • 不會控制通訊端的進程會起始資料傳輸。 在控制程式起始的所有資料傳輸作業都已完成之前,SAN 服務提供者不會交換通訊端的控制權。

  • 不會控制通訊端的進程會呼叫 WSAAcceptWSPAcceptAcceptEx 函式,在接聽通訊端上啟動連接接受作業。 在控制程式起始的所有接受要求都已完成之前,SAN 服務提供者不會交換通訊端的控制權。

參數會執行下列步驟,將連線 SAN 通訊端的控制權從控制進程交換至下一個控制進程 (如需交換程式的概觀,請參閱 WSPDuplicateSocket function.) 檔的一節中的表格:

  1. 參數會在控制程式中暫停處理來自應用程式的新要求。 當 SAN 通訊端上進行的所有傳送和 RDMA 作業都完成時,交換器會呼叫 SAN 服務提供者的 WSPSend 函式,以傳送訊息給連線的對等,以要求暫停會話,並呼叫 SAN 服務提供者的 WSPDeregisterMemory 函式,以釋放用於傳送作業的所有本機緩衝區。 因此,對等連線上的交換器會暫停處理新的應用程式要求、等待 SAN 通訊端上進行的所有傳送和 RDMA 作業完成,並釋放所有 RDMA 記憶體。 對等連線接著會傳送回復訊息,指出會話已暫停。 收到此確認訊息時,本機端點上的參數會呼叫 SAN 服務提供者的 WSPDeregisterRdmaMemory 函式 ,以釋放所有 RDMA 記憶體。 此時,連線兩個端點上的 SAN 通訊端只能有擱置中的接收要求。 這些接收要求會保留在遠端對等的 SAN 通訊端上擱置中,以允許重新啟用會話。 控制程式中本機 SAN 通訊端上的接收要求會在下一個步驟中完成。 當連線暫停時,遠端對等連線的交換器會排入新的封鎖或重迭的要求佇列、緩衝新的非封鎖傳送至SO_SNDBUF設定、在達到緩衝區限制之後失敗新的非封鎖傳送,以及讓 WSAEWOULDBLOCK 的所有新非封鎖接收失敗。 控制進程中的本機參數會處理應用程式通訊端上的新要求,就像進程沒有通訊端的控制權一樣。

  2. 暫停會話之後,交換器會在控制程式中呼叫 SAN 服務提供者的 WSPDuplicateSocket 函式,以指示 SAN 服務提供者將通訊端內容傳輸至下一個控制進程的位址空間。 參數會在WSPDuplicateSocketdwProcessId參數中指定下一個控制進程。 WSPDuplicateSocket函式必須呼叫WPUCompleteOverlappedRequest函式,以完成通訊端上具有成功狀態和零位元組的所有未處理接收要求。 SAN 服務提供者也必須自動釋放與這些要求相關聯的所有緩衝區。 SAN 服務提供者會釋放所有緩衝區,因為 WSPDuplicateSocket 傳回之後,交換器不會在 SAN 通訊端上要求更多作業。 唯一可能的例外狀況是 WSPCloseSocket 函式呼叫,如下一個步驟所述。 WSPDuplicateSocket傳回之後,參數會將值儲存在lpProtocolInfo輸出參數指向之WSAPROTOCOL_INFOW結構的dwProviderReserved成員中。 參數會使用這個值來識別下一個控制進程內容中的基礎通訊端。 因此, dwProviderReserved 中的值必須唯一識別系統上所有進程的基礎通訊端和該通訊端的連線。 此外,這個值只有在WSPDuplicateSocket之 dwProcessId參數中指定的進程內容中才有效。

  3. 在通訊端內容傳輸到下一個控制進程的位址空間之後,交換器會在下一個控制進程的內容中呼叫 SAN 服務提供者的 WSPSocket 函式。 在此呼叫中,參數會將WSPDuplicateSocket呼叫中傳回的基礎通訊端值傳遞至lpProtocolInfo輸入參數指向之 WSAPROTOCOL_INFOW 結構的dwProviderReserved成員。 如果下一個控制進程未要求建立 SAN 通訊端,SAN 服務提供者必須建立新的通訊端,並呼叫 WPUCreateSocketHandle 函式以取得任何新通訊端所需的控制碼。 如果在下一個控制程式的內容中建立 SAN 通訊端,SAN 服務提供者可以重新啟用先前的通訊端,並針對先前使用的通訊端傳回相同的描述元。 在此情況下,SAN 服務提供者不應該呼叫 WPUCreateSocketHandle,但應該繼續使用交換器所提供的原始通訊端控制碼。 或者,不論先前是否存在於進程中的通訊端,SAN 服務提供者都可以建立新的通訊端。 在此情況下,參數必須在下一個控制程式的內容中呼叫 SAN 服務提供者的 WSPCloseSocket 函式,以處置先前的通訊端描述元。

  4. 參數會在下一個控制程式中重新開機處理來自應用程式的新要求。

交換器會以類似的方式複製接聽通訊端,不同之處在于不需要參數來暫停會話。 參數會等到它完成由應用程式接受AcceptEx呼叫所起始的所有WSPAccept呼叫,再呼叫控制程式中 SAN 服務提供者的WSPDuplicateSocket函式。

因為交換器會在呼叫 SAN 服務提供者的 WSPDuplicateSocket 函式之前暫停處理 SAN 通訊端上的新要求,所以 SAN 服務提供者可以在控制程式中釋放與本機端點相關聯的所有資源。 SAN 服務提供者甚至可以終止基礎連線。 如果 SAN 服務提供者在控制程式中關閉基礎連線,則 SAN 服務提供者必須在下一個控制程式中呼叫 SAN 服務提供者的 WSPSocket 函式之後重新建立連線。 在 WSPSocket呼叫傳回之後,下一個控制進程內的 SAN 通訊端必須處於相同的狀態,從交換器的觀點來看,因為控制程式中的 SAN 通訊端是在呼叫 SAN 服務提供者的WSPDuplicateSocket函式之前。

如果 SAN NIC 支援在不同進程中執行的端點之間共用資源,在接收 WSPDuplicateSocket 呼叫之前,SAN 服務提供者不需要釋放控制程式中本機端點的資源。 在這種情況下,與本機端點相關聯的 SAN 通訊端在先前的控制程式中會保持非使用中狀態,直到交換器從下一個控制進程交換通訊端內容,或呼叫 SAN 服務提供者的 WSPCloseSocket 函式來明確關閉通訊端為止。 由於大部分應用程式會在原本建立的進程中執行通訊端的最終存取權,因此通常關閉連接--SAN 服務提供者可以在交換通訊端控制權切換至下一個控制進程之後,在控制程式中保留通訊端內容,則 SAN 服務提供者可以改善效能。

請注意,在所有情況下,SAN 通訊端描述項都必須保持有效狀態,直到交換器呼叫 SAN 服務提供者的 WSPCloseSocket 函式以明確關閉通訊端為止。 即使在接收 WSPDuplicateSocket 呼叫之前,SAN 服務提供者在接收 WSPDuplicateSocket 呼叫之前釋放通訊端的所有資源,在切換呼叫該描述元上的 WSPCloseSocket 之前,SAN 服務提供者不得重複使用通訊端的描述項。

非預期的進程結束或其他錯誤狀況可能會中斷 SAN 服務提供者的通訊端重複作業。 例如,資源不足可能會導致這類中斷。 參數會將這類錯誤狀況視為任何其他錯誤狀況。 如有必要,參數會關閉與所有進程中基礎通訊端相關聯的所有描述項,以強制終止通訊端的連線。 如果可能的話,遠端對等端的 SAN 服務提供者應該完成 WSPRecv 呼叫,以適當的錯誤碼接收傳入資料,例如 WSAECONNRESET。 此錯誤碼會通知遠端對等連線終止。 如果遠端對等上的交換器未收到此連線終止指示,則如果要求暫停的系統失敗,遠端對等的交換器就會逾時暫停連線。