wsaeventselect()
簡述:確定與所提供的fd_***網路事件集合相關的乙個事件物件。
#include
int wsaapi wsaeventselect ( socket s, wsaevent
heventobject, long lnetworkevents );
s:乙個標識套介面的描述字。
lnetworkevents:乙個遮蔽位,用於指定感興趣的fd_***網路事件組合。
返回值:
如果應用程式指定的網路事件及其相應的事件物件成功設定,則返回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_oob recv()
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 描述字不是乙個套介面。
摘自: http://hi.bccn.net/space-26735-do-blog-id-3670.html
封裝WSAEventSelect模型
include include pragma comment lib,ws2 32.lib pragma once class casynchandler virtual casynchandler virtual int acceptnotify socket hsocket,const char...
WSAEventSelect模型詳解
wsaeventselect 是 winsock 提供的一種非同步事件通知i o模型,與 wsaasyncselect模型有些類似。該模型同樣是接收 fd 之類的網路事件,但是是通過事件物件控制代碼通知,而非像 wsaasyncselect一樣依靠windows的訊息驅動機制。與wsaasyncse...
WSAEventSelect程式設計模型實現
伺服器端 把 include 放到最前面 至於原因,那是因為windows.h這個標頭檔案已經包含了winsock.h 和winsock2.h貌似有衝突 include include include include winsock.h pragma comment lib,wsock32 prag...