LPWSPCANCELBLOCKINGCALL 回呼函式 (ws2spi.h)
LPWSPCancelBlockingCall 函式會取消目前正在進行中的封鎖呼叫。
語法
LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;
int Lpwspcancelblockingcall(
[out] LPINT lpErrno
)
{...}
參數
[out] lpErrno
錯誤碼的指標。
傳回值
如果已成功取消作業, 則 LPWSPCancelBlockingCall 傳回的值為零。 否則,會傳回SOCKET_ERROR值,並在 lpErrno 中提供特定的錯誤碼。
錯誤碼 | 意義 |
---|---|
網路子系統失敗。 | |
表示沒有未完成的封鎖呼叫。 |
備註
此函式會取消此線程的任何未完成封鎖作業。 這通常用於兩種情況:
- Windows Sockets SPI 用戶端正在處理服務提供者實作虛擬封鎖時收到的訊息。 在此情況下, WSAIsBlocking 會是 true。
- 封鎖呼叫正在進行中,而 Winsock 服務提供者已透過從 WPUQueryBlockingCallback) 擷取的回呼函式來回呼 Winsock SPI 用戶端的封鎖攔截函式 (,進而叫用此函式。 例如,針對需要延長時間才能完成的作業實作 Cancel 選項時,可能會發生這類情況。
在每個案例中,原始封鎖呼叫會儘快終止,並出現 WSAEINTR 錯誤。 (在第一個實例中,除非 Windows 訊息排程導致控制還原回 Winsock 中的虛擬封鎖例程,否則不會進行終止。在第二個實例中,封鎖呼叫會在封鎖攔截函式完成時立即終止。)
在封鎖 LPWSPConnect 作業的情況下,Winsock 會儘快終止封鎖呼叫,但除非連線完成 (,然後重設) 或逾時,才能釋放套接字資源。只有在 Winsock SPI 用戶端立即嘗試開啟新的套接字 (如果沒有套接字可供使用) ,或透過 LPWSPConnect 呼叫連線到相同的對等時,這個情況可能才會明顯。
取消 LPWSPAccept 或 LPWSPSelect 呼叫並不會對傳遞至這些呼叫的套接字造成負面影響。 只有特定呼叫失敗;取消之前任何合法作業在取消之後都是合法的,而且套接字的狀態不會以任何方式受到影響。
取消 LPWSPAccept 和 LPWSPSelect 以外的任何作業,可能會使套接字處於不確定狀態。 如果 Winsock SPI 用戶端在套接字上取消封鎖作業,Winsock SPI 用戶端在套接字上執行的唯一作業就是 對 LPWSPCloseSocket 的呼叫,不過其他作業可以在某些 Winsock 服務提供者上運作。 如果 Winsock SPI 用戶端需要最大可移植性,請務必小心不要依賴取消作業之後的執行作業。 Winsock SPI 用戶端可以將SO_LINGER逾時設定為零,並呼叫 LPWSPCloseSocket 來重設連線。
如果取消作業以任何方式危害SOCK_STREAM數據流的完整性,Winsock 提供者會重設連線,並讓 LPWSPCloseSocket 與 WSAECONNABORTED 以外的所有未來作業失敗。
如果封鎖網路作業在取消之前完成, LPWSPCancelBlockingCall 可以成功傳回。 在此情況下,封鎖作業會成功傳回,就像從未呼叫 LPWSPCancelBlockingCall 一樣。 Winsock SPI 用戶端確認實際取消作業的唯一方法是檢查來自封鎖呼叫的 WSAEINTR 傳回碼。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限桌面應用程式] |
標頭 | ws2spi.h |