GetQueuedCompletionStatus 如何识别完成端口就绪任务的读写类型
完成端口就绪任务读写类型判断方案
GetQueuedCompletionStatus 本身的返回参数不直接携带IO操作类型标识,需要通过自定义扩展重叠结构的方式实现判断,具体实现逻辑如下:
- 第一步:定义扩展重叠结构,内置操作类型标识
标准OVERLAPPED结构仅用来存储系统IO相关的状态,我们需要在其基础上扩展自定义字段记录操作类型,注意必须把OVERLAPPED放在结构的第一个位置,保证指针转换的兼容性,示例代码如下:
// 定义IO操作类型枚举 typedef enum { IO_OP_READ, IO_OP_WRITE, IO_OP_UNKNOWN } IoOpType; // 自定义扩展重叠结构 typedef struct { OVERLAPPED stOverlapped; // 标准重叠结构必须放在首位 IoOpType opType; // 自定义字段:存储当前IO的操作类型 // 可按需扩展其他字段:比如关联的套接字句柄、IO缓冲区指针等 } MyOverlapped;
- 第二步:投递IO请求时提前标记操作类型
调用WSARecv/ReadFile投递读请求、或者调用WSASend/WriteFile投递写请求前,先初始化MyOverlapped实例,把opType对应设置为IO_OP_READ或者IO_OP_WRITE,再把&stOverlapped的地址传给IO投递函数的重叠结构参数。 - 第三步:取出就绪任务时读取标识判断类型
调用GetQueuedCompletionStatus获取到LPOVERLAPPED类型的返回指针后,直接强制转换为MyOverlapped*类型,读取opType字段的值即可判断当前就绪任务是读操作还是写操作。
内容的提问来源于stack exchange,提问作者Optimus1
相关产品推荐
相关产品推荐

