簡述:
建立一個應用程式指定的阻塞鉤子函式.#include <winsock.h>
FARPROC PASCAL FAR WSASetBlockingHook ( FARPROC lpBlockFunc );
lpBlockFunc 指向要安裝的阻塞函式的函式指針.
注釋:
本函式安裝了一個新的函式,由Windows Sockets的實現用來實現阻塞套接口函式調用.Windows Sockets的實現中包含了一種預設的機制,通過它可以實現阻塞套接口函式. 函式WSASetBlockingHook()為應用程式提供了在"阻塞"時執行自己的程式,來代替預設的函式.
當一個應用程式調用了一個阻塞的Windows Sockets API操作時,Windows Sockets的實現啟動該操作,然後進入了和下列偽代碼相似的循環:
for(;;) {
/* flush messages for good user response */
while(BlockingHook())
;
/* check for WSACancelBlockingCall() */
if(operation_cancelled())
break;
/* check to see if operation completed */
if(operation_complete())
break; /* normal completion */
}
注意Windows Sockets的實現可能以不同的次序運行上述代碼,例如,對操作完成的檢查可能發生在調用阻塞鉤子函式之前.預設的BlockingHook()函式如下:
BOOL DefaultBlockingHook(void) {
MSG msg;
BOOL ret;
/* get the next message if any */
ret = (BOOL)PeekMessage(&msg,NULL,0,0,PM_REMOVE);
/* if we got one, process it */
if (ret) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* TRUE if we got a message */
return ret;
}
WSASetBlockingHook()函式用來支持需要更複雜訊息處理的應用程式-例如,使用了MDI(多文本界面)的程式.它並不是為運行通常應用程式函式的.特別的,唯一可以由客戶阻塞鉤子函式調用的唯一Windows Sockets API函式是WSACancelBlockingCall()-它將引起阻塞循環中止.
本函式必須為Windows的非多執行緒版本和多執行緒版本(如Windows NT)提供每執行緒基礎上的實現.這樣, 它為特殊的任務或執行緒提供了不影響其它任務或執行緒的基礎上替換阻塞機制的能力.
在Windows的多執行緒版本中沒有預設的阻塞鉤子函式-阻塞調用阻塞了進行該調用的執行緒.然而, 應用程式可以通過調用WSASetBlockingHook()安裝一個特定的阻塞鉤子.這為依賴於阻塞鉤子的應用程式提供了簡單的可移植性.
返回值:
返回值是一個指向前面安裝的阻塞函式例程的指針.調用WSASetBlockingHook()函式的應用程式或庫應該保留返回值,以使它在需要時能恢復.(若"嵌套"並不重要,應用程式可以簡單地放棄WSASetBlockingHook()返回值,並且最終使用WSAUnhookBlockingHook()來恢復預設的機制.)如果操作失敗, 返回一個NULL指針,並且可通過調用WSAGetLastError()獲得特定的錯誤代碼.
錯誤代碼:
WSANOTINITIALISED 使用本API前必須要進行一次成功的WSAStartup()調用.
WSAENETDOWNWindows Sockets的實現已經檢測到網路子系統故障.
WSAEINPROGRESS 一個阻塞的Windows Sockets操作正在進行.
參見:
WSAUnhookBlockingHook()