重叠IO
意义:
重叠IO是windows提供的一种异步读写文件的机制
作用:
正常读写文件(socket本质就是文件操作),如:recv, 是阻塞的, 将协议缓冲区中的数据全部复制到buffer里, 同一时间只能执行一个。
重叠IO异步读写, WSARecv, 操作系统单独开一个线程去读, 可以连续投递多个WSARecv
对基本的C/S的直接优化, (替换函数)
本质:
结构体:
typedef struct _WSAOVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;
参数:
前四个成员:系统使用, 无需操作
1.保留, 供服务提供商定义使用
2.保留, 供服务提供商定义使用(一般是接收或发送的字节数)
3.保留, 供服务提供商定义使用
4.保留, 供服务提供商定义使用(一般是错误码)
5.事件对象(和socket绑定)
使用:
异步选择:消息和socket绑定, 系统以消息机制反馈处理
事件选择:事件和socket绑定, 系统以事件机制反馈处理
重叠IO:重叠结构和socket绑定, 系统以重叠IO机制反馈处理
反馈方式:
事件通知
完成例程:回调函数
重叠IO逻辑:
事件通知:
调用:AcceptEx WSAReccv WSASend 投递
被完成的操作, 事件信号被置为有信号
调用WSAWaitForMultipleEvents获取事件信号
优化:
对事件检测进行优化, 创建线程将用户分组放在里面检测
问题:
如果连续多次send, 会一次性收到所有内容
完成例程:
回调函数:
调用:AcceptEx WSAReccv WSASend 投递
完成后自动调用回调函数
性能:完成端口最优
20000客户端同时连接普通电脑:CPU上升40%
完成端口只上升2%左右
其他模型延迟较高(线程也是有极限的)
如果一个socket投递两次会出现错误码:997
对比事件通知和完成例程:
事件通知:
我们自己等待每个事件, 分配任务, 循环次数多, 延迟
完成例程:
系统根据具体时间自动调用我们写好的代码, 自动分类
问题:
客户端连续多次Send, 只会产生一次接收消息, 一次接收完所有数据(不重要)