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;