WSAEventSelect 功能描述

2021-05-11 02:13:42 字數 1977 閱讀 3961

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...