接受連線要求
如果應用程式呼叫 WSAAccept、 accept或 AcceptEx 函式以接受通訊端上的連入連線要求,Windows Sockets 參數一律會將此呼叫轉送給 TCP/IP 服務提供者。 如果連入連線要求從非 SAN 網路抵達,它會流經 NDIS 路徑,而 TCP/IP 服務提供者會處理它。 如果連線要求從 SAN 上的遠端對等互連送達,交換器會作為 TCP/IP 服務提供者與 SAN 服務提供者之間的媒介,以判斷是否要接受連線要求,以及完成應用程式的 WSAAccept、 accept或 AcceptEx 函式。
下圖顯示 Windows Sockets 交換器與 SAN 服務提供者之間的互動概觀,以判斷是否要接受或拒絕傳入連線要求。 後續的序列和區段會更詳細地描述接受判斷。
接受或拒絕連線要求
從遠端對等接收傳入連線要求時,SAN 服務提供者會發出事件物件的訊號,如 接聽 SAN 上的連線中所述。
Windows Sockets 參數會呼叫 SAN 服務提供者的 WSPEnumNetworkEvents 函式,以接收FD_ACCEPT事件程式碼。
在接收FD_ACCEPT事件碼時,參數會呼叫 SAN 服務提供者的 WSPAccept 函式來接受或拒絕傳入連線要求。
在交換器的 SAN 服務提供者 WSPAccept 函式呼叫中,參數會指定條件函式。 SAN 服務提供者必須在從WSPAccept呼叫之前呼叫WSPAccept函式的相同執行緒中呼叫此條件函式。
參數會從此條件函式傳回CF_ACCEPT或CF_REJECT程式碼,指出它分別接受或拒絕連線要求。
接受連線要求並建立接受通訊端
如果應用程式接受傳入連線要求,交換器會將CF_ACCEPT程式碼傳回給 SAN 服務提供者,以完成交換器的條件函式。 在接收CF_ACCEPT時,SAN 服務提供者會初始化內部資料結構,其中會儲存接受通訊端的相關資訊。 SAN 服務提供者的 WSPAccept 函式必須接著呼叫 WPUCreateSocketHandle 函式,才能從交換器取得接受通訊端的描述元。 SAN 服務提供者必須將參數的描述項儲存在其接受通訊端的內部資料結構中,而且必須傳回它自己的描述元,接受通訊端才能完成 WSPAccept 呼叫。 當呼叫 SAN 服務提供者的函式時,交換器必須為接受通訊端提供 SAN 服務提供者的內部描述元,而 SAN 服務提供者必須在呼叫交換器時,提供交換器的通訊端描述元。
成功完成 WSPAccept之前,SAN 服務提供者應該呼叫 Win32 ResetEvent 函式來重設事件物件。 這麼做可讓 SAN 服務提供者稍後呼叫 Win32 SetEvent 函式,以向交換器發出信號,以接受下一個連入連線要求。
拒絕連線要求
如果應用程式拒絕傳入連線要求,交換器會將CF_REJECT程式碼傳回給 SAN 服務提供者,以完成交換器的條件函式。 在接收CF_REJECT時,SAN 服務提供者應該將 WSAECONNREFUSED 錯誤碼傳回參數,以完成 WSPAccept 呼叫。
指出對遠端對等連線要求的接受或拒絕
在 SAN 服務提供者可以向遠端對等指出它接受或拒絕遠端對等連線要求之前,SAN 服務提供者必須呼叫交換器的條件函式。 根據參數條件函式傳回的值,SAN 服務提供者應該對遠端對等互連發出下列其中一個指示:
如果參數的條件函式傳回CF_ACCEPT,SAN 服務提供者應該表示它接受遠端對等的連線要求。 然後,遠端對等上的 SAN 服務提供者可以順利完成由 WSPConnect 呼叫起始的連線作業。
如果參數的條件函式傳回CF_REJECT,SAN 服務提供者應該指出它拒絕遠端對等的連線要求。 遠端對等上的 SAN 服務提供者必須失敗,其連線作業是由 WSPConnect 呼叫所起始,並出現 WSAECONNREFUSED 錯誤碼。
會話交涉
當交換器成功使用 SAN 服務提供者接受來自遠端對等的連線要求之後,交換器就會與該對等交涉會話。
交涉會話
遠端對等端的交換器會呼叫 SAN 服務提供者的 WSPRecv 函式,以張貼一組接收緩衝區。
遠端對等的交換器會呼叫 SAN 服務提供者的 WSPSend 函式,以將會話交涉訊息傳送至本機接受端點的交換器。 此訊息包含交換器在遠端對等端張貼的接收緩衝區數目。
本機接受端點的交換器會呼叫本機 SAN 服務提供者的 WSPRecv 函式來張貼自己的接收緩衝區,但可能無法及時接收會話交涉訊息。 如果本機交換器未及時張貼接收緩衝區,而且基礎 NIC 不支援流程式控制制,則本機接受端點上的 SAN 服務提供者必須在自己的私人接收緩衝區中緩衝遠端交換器的會話交涉訊息。 當交換器張貼接收緩衝區時,SAN 服務提供者會將資料從其私人接收緩衝區複製到一對一交換器緩衝區,直到所有資料都從私人緩衝區複製到交換器緩衝區為止。
SAN 服務提供者會在後續的交換器緩衝區上執行一般接收處理,也就是說,它會將所有這類交換器緩衝區張貼到 NIC 上的接收佇列。
請注意,SAN 服務提供者不得直接卸載連線,因為交換器未在會話交涉訊息抵達之前張貼接收緩衝區。 會話交涉訊息的最大長度是 256 個位元組。
本機接受端點的參數會在回應會話交涉訊息之前張貼其接收緩衝區。 本機交換器會呼叫本機 SAN 服務提供者的 WSPSend 函式,以回應會話交涉訊息。 本機交換器的回應包含本機交換器張貼的接收緩衝區數目。 從這一點開始,本機交換器會保證所張貼的接收緩衝區集大小足以接收連線上抵達的任何訊息。
如果應用程式在其 AcceptEx 呼叫中指定初始接收緩衝區,參數會等到它從遠端對等接收第一個資料訊息,再完成應用程式的 AcceptEx 呼叫。
如果應用程式取消自己的 接受 呼叫,交換器會呼叫適當的 SAN 服務提供者 WSPCloseSocket 函式,以關閉接受的 SAN 通訊端。