WSAEventSelect 就是 select的增强版;
注意WSAEventSelect 是通知异步, 而不是传送数据异步;
总的来说就是一个异步的阻塞模型;
如果要与 select 做个比较的话 :
select 在 需要进行或者可以进行io处理时 返回. 而WSAEventSelect 在返回时(WSAWaitForMultipleEvents) 与io状态无关;
例如: select 在收到数据 并返回时 , 他监听此套接字并检查接受缓冲区, 等到缓冲区能读时再返回.
而WSAEventSelect 的等待函数 WSAWaitForMultipleEvents 只要此套接字有事件发生就返回;
因此称为异步通知;
另WSAEventSelect 与 nix下的 epoll 整体编程模型很像; epoll : epoll 说明
具体使用到的函数:
WSACreateEvent 创建一个事件, 默认手动模式
WSAEventSelect 让一个套接字与一个事件捆绑在一起 注册到操作系统, 无需像select 每次重置;
* WSAWaitForMultipleEvents (阻塞) 等待套接字对应的事件发生, 最多能监听WSA_MAXIMUM_WAIT_EVENTS 个事件;
* WSAEnumNetworkEvents 查看套接字对应的具体事件 ; 这也就是与select 返回时机的不同的原因; 注意:此函数将重置事件,
因此无需调用WSAResetEvent;
重要就这4个函数, 其他的函数调用查看msdn 即可
echo_serv.c
#include "../utils.h"
#define BUFF_SIZE 8192
//关闭套接字后 . 调整数组
static void adjust_sockarr(SOCKET * sock_arr, int start_index, int total){
for (int i = start_index; i < total; ++i)
sock_arr[i] = sock_arr[i + 1];
}
//关闭事件后, 调整数组
st