您的位置:首页 > 其它

WSAEventSelect模型学习

2010-09-14 09:36 148 查看
它允许程序在一个套接字上接收以事件为基础的网络事件通知。

事件对象

该模型要求程序对打算使用的每个套接字首先创建一个事件对象,方法是调用WSACreateEvent函数

WSAEVENT WSACreateEvent(
void
);

该函数返回创建好的事件对象。

事件对象创建好后,必须将其与某个套接字关联在一起,同时注册感兴趣的网络事件类型。需调用WSAEventSelect函数。

int
WSAEventSelect(

SOCKET sock, /* 套接字 */

WSAEVENT hEvent, /*
事件对象 */

long lNetworkEvents /* 对应一个"位掩码",指定感兴趣的网络事件类型 */

);

创建的事件拥有两种工作状态和两种模式。

工作状态 : 已传信和未传信

工作模式 :
人工重设和自动重设

由WSACreateEvent创建的事件对象,默认工作状态为"未传信",工作模式为"人工重设",当网络事件触发了与套接字关联在一起的事件对象时,工作状态会转变为"已传信",而在完成了一个I/O请求的处理之后,因为工作模式为"人工重设",因此,程序需要将工作状态从"已传信"改变为"未传信",使用WSAResetEvent函数

BOOL
WSAResetEvent( WSAEVENT hEvent
);

当程序不在对事件对象进行处理时,应调用WSACloseEvent函数将其关闭

BOOL WSACloseEvent( WSAEVENT
hEvent
);

套接字与事件对象关联在一起后,便可开始进行I/O操作,方法是等待一个或多个事件对象,并在事先指定的一个或所有句柄进入"已传信"状态,或在超过了一个规定的时间间隔后,立即返回。使用WSAWaitForMultipleEvents函数

DWORD
WSAWaitForMultipleEvents(

DWORD cEvents, /*
指定lphEvents的数量,最大为WSA_MAXIMUM_WAIT_EVENTS(64) */

const WSAEVENT
*lphEvents, /* 事件对象数组 */

BOOL fWaitAll,

DWORD dwTimeout, /*
等待时间,为0,立即返回,为WSA_INFINITE,永不返回 */

BOOL fAlertable /* 可设为FALSE
*/

);

fWaitAll :
指定如何等待lphEvents数组内的事件对象,为TRUE时,只有当所有事件对象都进入"已传信"时,才会返回,若为FALSE时,只要一个事件进入"已传信"状态,就返回,通常设为FALSE

返回值:返回发生网络事件的事件对象索引

当发生网络事件后,接下来可调用WSAEnumNetworkEvents函数来检查发生了什么类型的网络事件

int
WSAEnumNetworkEvents(

SOCKET sock,

WSAEVENT hEvent,

LPWSANETWORKEVENTS lpNetworkEvents

);

lpNetworkEvents :
为一个结构,内包含发生的事件及可能的错误代码

typedef struct _WSANETWORKEVENTS

{

long
lNetworkEvents; /* 发生的网络事件 */

int iErrorCode[FD_MAX_EVENTS]; /* 可能的错误代码
*/

}WSANETWORKEVENTS,*LPWSANETWORKEVENTS;

iErrorCode :
指定错误代码数组,其索引名为事件类型名+'_BIT'(如FD_READ_BIT)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: