共用方式為


重疊的 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 表示已成功起始重疊的作業,並在取用傳送緩衝區或完成接收作業時提供後續指示。 不過,對於位元組數據流樣式的套接字,無論緩衝區是否已滿,只要傳入數據用盡,就會發生完成指示。 任何其他錯誤碼都表示重疊的作業未成功起始,而且不會有任何完成指示即將來臨。

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

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

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