WSA...Event
一、基础
(一)WSAEVENT
1.说明
WSAEVENT 类型本质上就是使用 CreateEvent 创建的 Event 对象:
2.有关原型
#define WSAEVENT HANDLE
(二)WSA_MAXIMUM_WAIT_EVENTS
1.说明
事件对象句柄的最大数目 是WSA_MAXIMUM_WAIT_EVENTS。
2.有关原型
#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS)
3.使用
list<pair<SOCKET, WSAEVENT>> m_ListToSockEvent;
WSAEVENT AryEvent[WSA_MAXIMUM_WAIT_EVENTS] = {0}; // 将vector中的数据放入AryEvent中 pThis->m_CriticalSection.Enter(); int nCount = 0; for (auto ListData : pThis->m_ListToSockEvent) { AryEvent[nCount] = ListData.second; nCount++; } pThis->m_CriticalSection.Leave();
(三)DWORD
DWORD(DOUBLE WORD)就是双字节的意思,两个字(32位)
(四)WSANETWORKEVENTS 结构
1.说明
WSANETWORKEVENTS 结构用于存储套接字有关网络事件的内部信息。
2.原型
typedef struct _WSANETWORKEVENTS { long lNetworkEvents; //指示发生了哪些FD_XXX网络事件。 int iErrorCode[FD_MAX_EVENTS]; //包含任何关联的错误代码的数组,其数组索引对应于 lNetworkEvents 中事件位的位置。
// 标识符FD_READ_BIT、FD_WRITE_BIT和其他标识符可用于为 iErrorCode 数组编制索引。 } WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
3.使用样例
WSANETWORKEVENTS NetWorkEvents;
二、函数
(一)WSACreateEvent
1.说明
创建一个新的事件对象。
2.函数原型
#include <winsock2.h>
WSAEVENT WSAAPI WSACreateEvent( VOID ); //返回值: //如果函数成功,则返回值即是事件对象的句柄。 //如果函数失败,返回WSA_INVALID_EVENT。应用程序可通过调用WSAGetLastError()函数获取进一步的错误信息。
3.代码样例
// 创建事件对象 WSAEVENT hEvent = WSACreateEvent();
(二)WSAEventSelect
1.说明
确定与所提供的FD_XXX网络事件集合相关的一个事件对象。
2.函数原型
int WSAEventSelect( SOCKET s,//套接字句柄 WSAEVENT hEvent,//为事件对象句柄 Long INetworkEvents);//应用程序感兴趣的网络事件集合 //应用程序为套接字注册网络事件成功
返回值:
- 成功返回0。
- 失败返回SOCKET_ERROR通过WSAGetLastError()获取错误信息。
3.代码样例
// 关联网络事件 WSAEventSelect(sClient, hEvent, FD_READ | FD_CLOSE);
(三)WSAWaitForMultipleEvents
1.说明
只要指定事件对象中的一个或全部处于有信号状态,或者超时间隔到,则返回。
该函数可以等待网络事件的发生。它的目的是等待一个或是所有的事件对象变为已触发状态。
2.函数原型
#include <winsock2.h>
WSAWaitForMultipleEvents( DWORD cEvents, const WSAEVENTFAR * lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ); cEvents:指出lphEvents所指数组中事件对象句柄的数目。事件对象句柄的最大值为WSA_MAXIMUM_WAIT_EVENTS(64)。 lphEvents:指向一个事件对象句柄数组的指针。 fWaitAll:指定等待类型。若为真TRUE,则当lphEvents数组中的所有事件对象同时有信号时,函数返回。 若为假FALSE,则当任意一个事件对象有信号时函数即返回。在后一种情况下,返回值指出是哪一个事件对象造成函数返回。/***/ dwTimeout:指定超时时间间隔(以毫秒计)。当超时间隔到,函数即返回,不论fWaitAll参数所指定的条件是否满足。 如果dwTimeout为零,则函数测试指定的时间对象的状态,并立即返回。 如果dwTimeout是WSA_INFINITE,则函数的超时间隔永远不会到。 fAlertable:指定当系统将一个输入/输出完成例程放入队列以供执行时,函数是否返回。若为真TRUE,则函数返回且执行完成例程。 若为假FALSE,函数不返回,不执行完成例程。请注意在Win16中忽略该参数。
当fWaitAll==false时,返回值减 去WSA_WAIT_EVENT_0 指示导致函数返回其状态的事件对象的索引。 如果在调用期间发出了多个事件对象的信号,则这是信号事件对象的数组索引,其索引值为所有信号事件对象的最小索引值。
如果函数成功,返回值指出造成函数返回的事件对象。
如果函数失败,返回值为WSA_WAIT_FAILED。可调用WSAGetLastError()来获取进一步的错误信息。
3.代码样例
AryEvent指向数组
// 返回导致返回的事件对象 DWORD dwRet = WSAWaitForMultipleEvents(nCount, AryEvent, FALSE, 1000, FALSE); if (dwRet == WSA_WAIT_FAILED || dwRet == WSA_WAIT_TIMEOUT) { continue; }
if (it->second == AryEvent[dwRet - WSA_WAIT_EVENT_0])
(四)WSAEnumNetworkEvents
1.说明
WSAEnumNetworkEvents函数为指定的套接字查看已发生的网络事件,清理网络事件的记录,然后重置事件对象(可选)。
检测所指定的套接口上网络事件的发生。
2.函数原型
int WSAAPI WSAEnumNetworkEvents( [in] SOCKET s, //标识套接字的描述符。 [in] WSAEVENT hEventObject, //用于标识要重置的关联事件对象的可选句柄。 [out] LPWSANETWORKEVENTS lpNetworkEvents //指向 WSANETWORKEVENTS 结构的指针,该结构填充了发生的网络事件记录和任何关联的错误代码。 ); //如果操作成功,则返回值为零。 否则,返回值SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误号。
3.代码样例
list<pair<SOCKET, WSAEVENT>>::iterator it = pThis->m_ListToSockEvent.begin()
WSANETWORKEVENTS NetWorkEvents; int nRet = WSAEnumNetworkEvents(it->first, it->second, &NetWorkEvents);
// 如果是可读事件发生 if (NetWorkEvents.lNetworkEvents & FD_READ)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了