它允许程序在一个套接字上接收以事件为基础的网络事件通知。
事件对象
该模型要求程序对打算使用的每个套接字首先创建一个事件对象,方法是调用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)
网络事件驱动I/O
本文介绍了一种基于事件驱动的网络I/O模型,通过WSA API实现网络事件的通知与处理。涉及事件对象的创建、与套接字的关联、状态管理、等待事件以及事件检查等关键步骤。
136

被折叠的 条评论
为什么被折叠?



