重迭的 I/O 和事件物件

Windows Sockets 2 支援重迭的 I/O,而所有傳輸提供者都支援此功能。 重迭的 I/O 遵循在 Windows 中建立的模型,而且可以在使用通訊端函式或WSASocket函式建立的通訊端上執行,並在dwFlags參數中設定WSA_FLAG_OVERLAPPED旗標所建立的通訊端上執行。

注意

使用重迭屬性建立通訊端不會影響通訊端目前處於封鎖或非封鎖模式。 使用重迭屬性建立的通訊端可用來執行重迭的 I/O,這麼做並不會變更通訊端的封鎖模式。 由於重迭的 I/O 作業不會封鎖,因此通訊端的封鎖模式與這些作業無關。

 

若要接收,應用程式會使用 WSARecvWSARecvFrom 函式來提供要接收資料的緩衝區。 如果在網路收到資料之前張貼一或多個緩衝區,該資料可能會在到達時立即放置在使用者的緩衝區中。 因此,它可以避免在叫用 recvrecvfrom 函式時發生的複製作業。 如果在張貼接收緩衝區時已有資料存在,則會立即將它複製到使用者的緩衝區。

如果應用程式未張貼任何接收緩衝區時收到資料,則網路會採用熟悉的同步操作樣式。 也就是說,傳入的資料會在內部緩衝處理,直到應用程式發出接收呼叫為止,進而提供可複製資料的緩衝區。 例外狀況是當應用程式使用 setsockopt 將接收緩衝區的大小設定為零時。 在此實例中,可靠的通訊協定只會允許在張貼應用程式緩衝區且不可靠的通訊協定上的資料會遺失時接收資料。

在傳送端,應用程式會使用 WSASendWSASendTo 來提供已填滿緩衝區的指標,然後同意不要以任何方式干擾緩衝區,直到網路取用緩衝區的內容為止。

重迭的傳送和接收呼叫會立即傳回。 傳回值為零表示 I/O 作業已立即完成,且已發生對應的完成指示。 也就是說,相關聯的事件物件已發出訊號,或已完成常式已排入佇列,並在呼叫執行緒進入可警示的等候狀態時執行。

傳回值SOCKET_ERROR與錯誤碼 WSA_IO_PENDING表示重 迭的作業已成功起始,且後續指示會在取用傳送緩衝區或接收作業完成時提供。 不過,對於位元組資料流程樣式的通訊端,不論緩衝區是否已滿,只要傳入資料耗盡時,就會發生完成指示。 任何其他錯誤碼都表示重迭的作業未成功起始,而且即將開始沒有完成指示。

傳送和接收作業都可以重迭。 接收函式可以叫用數次,以張貼接收緩衝區以準備傳入資料,而且可以叫用數次傳送函式,將多個緩衝區排入佇列以傳送。 雖然應用程式可以依賴依提供的順序傳送的一系列重迭傳送緩衝區,但對應的完成指示可能會以不同的順序發生。 同樣地,在接收端,緩衝區可以填入提供的順序,但完成指示可能會以不同的順序發生。

在許多情況下,使用AcceptExConnectExWSASend、WSARecvTransmitFile和類似函式的Winsock重迭作業是可取消的。 不過,針對已取消未完成作業的通訊端繼續使用,未定義行為。 取消重迭的作業之後,應該呼叫 closesocket 函式。 因此,為了獲得最佳結果,而不是直接取消 I/O,應該呼叫 closesocket 函式來關閉通訊端,最終會停止所有擱置的作業。

重迭 I/O 的延後完成功能也適用于 WSAIoctl,這是 ioctlsocket的增強版本。