WSAEventSelect模型,容許應用程序在一個或者多個套接字上接受基於時間的網絡通知,也接受FD_XXX類型的網絡事件,依靠windows的消息驅動機制和事件對象關聯起來。編程
基本思路:爲感興趣的一組網絡事件建立個事件對象,調用WSAEventSelect函數將網絡事件和事件對象關聯起來.windows
winsock建立事件對象的函數WSACreateEvent,定義:數組
WSAEVENT WSACreateEvent(void);//返回一個手工設置的事件對象句柄
建立之後,調用WSAEventSelect函數指定網絡事件與它關聯到一塊兒網絡
int WSAEventSelect( SOCKET s, WSAEVENT hEventObject,//事件對象句柄 long lNetWorkEvents//感興趣的組合 );
WSAWaitForMultipleEvents函數在一個或者多個事件上等待,當等待事件對象受信,或者指定事件過去時,函數返回函數
DWORD WSAWaitForMultipleEvents( DWORD cEvents,//指定下面所指數組中的事件對象句柄的個數 const WSAEVENT* lphEvents,//指向事件對象句柄數組 BOOL fWaitAll,//指定是否等待全部事件對象編程受信狀態 DWORD dwTimeout,//指定等待時間 BOOL fAlertable//使用WSAEventSelect能夠忽略 );
最多支持WSA_MAXIMUM_WAIT_EVENTS個對象,定義爲64.測試
WSAWaitForMultipleEvents等待網絡事件的發生spa
過了指定事件:返回WSA_WAIT_TIMEOUT 指定事件內有網絡事件發生:返回值指明發生事件對象 函數調用失敗:返回WSA_WAIT_FAILED
dwTimeout值爲0,指定事件對象狀態,當即返回,測試是否受信code
fWaitAll設置爲false後,若是有幾個,也只能指明一個,句柄最前面的那個...對象
對象受信,找到相應的套接字,調用WSAEnumNetWorkEvents函數,便可查看發生了什麼網絡事件:blog
int WSAEnumNetWorkEvents( SOCKET s, WSAEVENTS hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );
最後一個參數用於取得套接字發生的網絡事件和相關的錯誤代碼:
typedef struct _WSANETWORKEVENTS{ long lNetworkEvents;//指定發生的網絡事件 int iErrorCode[FD_MAX_EVENTS];//取得錯誤代碼 }WSANETWORKEVENTS,*LPWSANETWORKEVENTS;