windows异步select和重叠io

WSAEVENT events[];
SOCKET socks[];
events用WSACreateEvent初始化,用WSAEventSelect绑定sock并指明接收什么网络事件一般有
* FD_READ
* FD_WRITE 发送失败触发
* FD_ACCEPT 接收到连接事件
* FD_CLOSE

WSAWaitForMultipleEvents 可以等待events中的一个或多个事件,一般在整个数组中等待时,返回第一个
有事件的位置,需减一个WSA_WAIT_EVENT_0,然后再用这个依次往后检查其它sock是否有事件到来。
WSAEnumNetworkEvents 列举有事件到来的socket上的事件类型,存于WSANETWORKEVENTS 强者构中

typedef struct _WSANETWORKEVENTS {
       long lNetworkEvents;
       int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;
用法模板
if (event1.lNetworkEvents & FD_READ) {
	if (event1.iErrorCode[FD_READ_BIT] == 0) {
		char str[256];
		int nRecv = recv(sock[i], str, strlen(str), 0);
		if (nRecv > 0)cout << str << endl;
	}
}

重叠IO利用event模型

  • 调用WSArecv
  • 需要一个WSAOVERLAPPED和WSABUF,后者存一个buffer及buffer长度
  • WSArecv不阻塞,没完成返回WSA_IO_PENDING
  • WSAWaitForMultipleEvents 阻塞监听或不阻塞监听,本质上还是得忙等
  • WSAGetOverlappedResult检查有没有收到数据

typedef struct _WSABUF {
    ULONG len;     /* the length of the buffer */
    _Field_size_bytes_(len) CHAR FAR *buf; /* the pointer to the buffer */
} WSABUF, FAR * LPWSABUF;

typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    union {
        struct {
            DWORD Offset;
            DWORD OffsetHigh;
        } DUMMYSTRUCTNAME;
        PVOID Pointer;
    } DUMMYUNIONNAME;

    HANDLE  hEvent;
} OVERLAPPED, *LPOVERLAPPED;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值