簡述:
確定與所提供的FD_XXX網路事件集合相關的一個事件對象。#include <winsock2.h>
int WSAAPI WSAEventSelect ( SOCKET s, WSAEVENT
hEventObject, long lNetworkEvents );
s:一個標識套接口的描述字。
hEventObject:一個句柄,用於標識與所提供的FD_XXX網路事件集合相關的一個事件對象。
lNetworkEvents:一個禁止位,用於指定感興趣的FD_XXX網路事件組合。
返回值:
如果應用程式指定的網路事件及其相應的事件對象成功設定,則返回0。否則的話,將返回INVALID_SOCKET錯誤,應用程式可通過WSAGetLastError()來獲取相應的錯誤代碼。在使用select()和WSAAsyncSelect()函式時,WSAEventSelect()常用來決定何時進行數據傳送操作(如send()或recv()),並期望能立即成功。但是一個穩定的應用程式應該做好這樣的準備,即事件對象被設定,並且一個WinSock調用以WSAEWOULDBLOCK立即返回 。舉例來說,有可能發生下述操作序列:
(i) 套接口s上到達數據;WinSock設定了WSAEventSelect事件對象。
(ii) 應用程式進行其他操作。
(iii) 在進行操作時,應用程式調用了ioctlsocket(s, FIONREAD...)並發現有數據可讀。
(iv) 應用程式調用一個recv(s,...)來讀取數據。
(v) 最後應用程式等待WSAEventSelect()所指定的數據對象,該數據對象指出數據可讀。
(vi) 應用程式調用recv(s,...),但以WSAEWOULDBLOCK錯誤失敗。
其他的操作序列也是可能的。
成功地記錄了網路事件的發生(通過設定內部網路事件記錄的相應位),並且將相應的事件對象設定了信號後,不會對該網路事件作進一步的操作,直到應用程式調用了相應的函式顯式地重新允許該網路事件及相應事件對象的信號。
網路事件重新允許函式
FD_READ recv() 或 recvfrom()
FD_WRITE send() 或 sendto()
FD_OOBrecv()
FD_ACCEPT accept() 或WSAAccept(),直到返回的錯誤代碼為 WSATRY_AGAIN,指明條件函式返回CF_DEFER。
FD_CONNECT NONE
FD_CLOSE NONE
FD_QOS用SIO_GET_QOS 命令調用WSAIoctl()。
FD_GROUP_QOS 用SIO_GET_GROUP_QOS命令調用WSAIoctl()。
錯誤代碼:
WSANOTINITIALISED 在調用本API之前應成功調用WSAStartup()。
WSAENETDOWN 網路子系統失效。
WSAEINVAL 參數中有非法值,或者指定的套接口處於非法狀態。
WSAEINPROGRESS 一個阻塞的WinSock調用正在進行中,或者服務提供者仍在處理一個回調函式
WSAENOTSOCK 描述字不是一個套接口。
另請參閱:WSACloseEvent() ,WSACreateEvent(),WSAEnumNetworkEvents(),WSAGetOverlappedResult(),WSAWaitForMultipleEvents().