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)
事件对象
该模型要求程序对打算使用的每个套接字首先创建一个事件对象,方法是调用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)
相关文章推荐
- WinSock学习笔记4:WSAEventSelect模型
- WinSock学习笔记4:WSAEventSelect模型
- WinSock学习笔记4:WSAEventSelect模型
- 网络学习之WSAEventSelect模型
- 一个基于线程池的WSAEventSelect模型服务器设计
- winSocket编程(八)WSAEventSelect模型
- WSAEventSelect模型
- Windows socket之WSAEventSelect模型
- vc++ windows socket I/O模型 WSAeventSelect 模型例子
- WSAEventSelect模型
- 探究WSAEventSelect模型
- WSAEventselect模型中各网络事件触发机制
- WSAEventSelect模型 ---应用实例,重写TCP服务器实例
- WSAEventSelect模型编程
- 套接字IO模型(三) WSAEventSelect模型
- WSAEventSelect IO复用模型
- 套接字I/O模型之WSAEventSelect
- (三)Socket I/O模型之事件选择(WSAEventSelect)
- WSAEventSelect编程模型实现
- 基于事件的select:WSAEventSelect模型