起始連線
在 Windows Sockets 交換器收到由應用程式起始的 WSPConnect 呼叫之後,交換器會比較連線要求的目的地位址與 SAN 服務提供者所提供的 IP 子網資料表中的位址。 如果其中一個子網包含此目的地位址,交換器會呼叫對應 SAN 服務提供者的 WSPSocket 和 WSPBind 函式來建立和系結通訊端,如 建立和系結 SAN 通訊端中所述。 交換器會使用 SAN 通訊端處理應用程式的連線要求。 如果連線要求的目的地位址不在 SAN 子網上,或 SAN 服務提供者無法建立和系結通訊端,交換器會使用 TCP/IP 提供者來建立連線。
下圖顯示 Windows Sockets 切換如何要求與遠端對等互連的連線的概觀。 後續的序列和區段會更詳細地描述連線要求。
建立並系結 SAN 通訊端之後,參數會使用 非封鎖模式中的 SAN 通訊端來執行連線要求,如下列程式所述。
執行連線要求
參數會呼叫 SAN 服務提供者的 WSPEventSelect 函式。 在此呼叫中,參數會傳遞FD_CONNECT程式碼和與該程式碼相關聯的事件物件。 呼叫 WSPEventSelect 會要求通知線上活動,並通知 SAN 服務提供者,任何後續 的 WSPConnect 呼叫都會以非封鎖模式執行。
在 WSPEventSelect函式傳回之後,參數會呼叫 SAN 服務提供者的WSPConnect函式。 在此呼叫中,參數會以其中一個 WSK 位址系列的格式傳遞目的地位址。 SAN 服務提供者的 Proxy 驅動程式會將此目的地位址對應至原生位址,並嘗試建立連線。
如果 SAN 服務提供者的 WSPConnect 函式可以立即完成或失敗連線作業,則會傳回適當的成功或失敗碼。 如果 SAN 服務提供者的 WSPConnect 函式無法立即完成連線要求,SAN 服務提供者的連接作業會以非同步方式在另一個執行緒中繼續。 SAN 服務提供者的 WSPConnect 函式會傳回錯誤 WSAEWOULDBLOCK,指出通訊端標示為非封鎖,且無法立即完成連線作業。
連線作業完成之後,SAN 服務提供者會呼叫 Win32 SetEvent 函式,以向先前在 WSPEventSelect 呼叫中註冊的事件物件發出訊號。
發出事件物件訊號之後,參數會呼叫 SAN 服務提供者的 WSPEnumNetworkEvents 函式,以取得連線作業的結果。
注意 交換器透過 SAN 服務提供者建立連線之後,交換器就無法再使用該連線的 TCP/IP 提供者。 SAN 服務提供者必須完整實作服務已建立連線所需的所有功能。
終結 SAN 通訊端
如果 SAN 服務提供者的 WSPConnect 函式失敗,交換器會呼叫 SAN 服務提供者的 WSPCloseSocket 函式來終結 SAN 通訊端。 參數接著會呼叫 TCP/IP 服務提供者的 WSPConnect 函式,以將連線作業轉送到 TCP/IP 服務提供者,除非 SAN 服務提供者傳回下列其中一個錯誤碼作為連線作業的結果:
WSAECONNRESET
指出目的地位址上沒有應用程式正在接聽指定的埠
WSAECONNREFUSED
指出遠端應用程式主動拒絕連線要求
上述錯誤碼可確保嘗試透過 TCP/IP 建立連線也會失敗。 如果 SAN 服務提供者無法保證,則不得傳回下列其中一個錯誤碼。 例如,如果 SAN 上存在不支援 Windows 通訊端直接存取的目的電腦,但只能透過 NDIS 進行通訊,則 SAN 服務提供者無法傳回 WSAEHOSTUNREACH,因為透過 TCP/IP 提供者的連線要求可能會成功,因此無法傳回 WSAEHOSTUNREACH。 在此情況下,SAN 服務提供者應該會傳回 WSAETIMEDOUT。
會話交涉
交換器透過 SAN 服務提供者建立連線之後,交換器會呼叫 SAN 服務提供者的 WSPRegisterMemory 擴充功能函式,以預先註冊要接收傳入訊息之緩衝區陣列的記憶體。 參數接著會呼叫 SAN 服務提供者的 WSPRecv 函式來張貼一或多個緩衝區,以接收來自遠端對等的傳入訊息資料。 然後,參數會交換一組包含初始流程式控制制資訊的訊息,與其遠端對等交涉會話。 切換交涉會話之後,它會完成應用程式起始的 WSPConnect 呼叫。 然後,應用程式就可以開始在連線上傳送和接收資料。 如需詳細資訊,請參閱 接受連線要求。
透過 SAN 通訊端建立連線之後,交換器不會呼叫 SAN 服務提供者的 WSPConnect 函式。 交換器會在內部處理起始呼叫交換器 WSPConnect 函式的應用程式,以輪詢連線要求。