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)

 

posted @ 2023-02-26 21:53  ImreW  阅读(163)  评论(0编辑  收藏  举报