NoteDeep

意义:

重叠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, 只会产生一次接收消息, 一次接收完所有数据(不重要)

流程图:














评论列表

    意义:
    作用:
    本质:使用:重叠IO逻辑:
    性能:完成端口最优
    对比事件通知和完成例程:
    问题:
    流程图: