iocp基础

在看boost.asio源码时,看针对window平台的win_iocp_io_service中使用到iocp

OVERLAPPED结构

typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    union {
        struct {
            DWORD Offset;
            DWORD OffsetHigh;
        } DUMMYSTRUCTNAME;
        PVOID Pointer;
    } DUMMYUNIONNAME;

    HANDLE  hEvent;
} OVERLAPPED, *LPOVERLAPPED;

Internal:当前IO请求的状态,当我们向完成端口提交一个IO请求的时候如果请求还没有响应,这个值就会是STATUS_PENDING
InternalHigh:当前IO请求字节数
Offset:指定文件的起始偏移位置
OffsetHigh:指定开始传输数据的字节数的的高位
hEvent:是事件句柄,在IO请求完成后处于信号状态

使用方式

  • 使用结构体包含
  • C++类继承overlapped数据结构
    asio中就是使用这种方式

接口

HANDLE WINAPI CreateIoCompletionPort(
  _In_     HANDLE    FileHandle,
  _In_opt_ HANDLE    ExistingCompletionPort,
  _In_     ULONG_PTR CompletionKey,
  _In_     DWORD     NumberOfConcurrentThreads
);

CreateIoCompletionPort创建输入/输出 (I/O) 完成端口并将其与指定的文件句柄相关联,或创建尚未与文件句柄关联的 I/O 完成端口,以便稍后关联
FileHandle:打开的文件句柄或 INVALID_HANDLE_VALUE,INVALID_HANDLE_VALUE表示该函数将创建 I/O 完成端口
ExistingCompletionPort :现有 I/O 完成端口或 NULL 的句柄,如果此参数指定现有的 I/O 完成端口,则函数将其与 FileHandle 参数指定的句柄相关联,如果此参数为 NULL,则该函数将创建新的 I/O 完成端口
CompletionKey:指定文件句柄的每个 I/O 完成数据包中包含的每句柄用户定义完成密钥,用来来帮助应用程序跟踪已完成的 I/O 操作
NumberOfConcurrentThreads:操作系统允许并发处理 I/O 完成端口的 I/O 完成数据包的最大线程数

BOOL WINAPI PostQueuedCompletionStatus(
  _In_     HANDLE       CompletionPort,
  _In_     DWORD        dwNumberOfBytesTransferred,
  _In_     ULONG_PTR    dwCompletionKey,
  _In_opt_ LPOVERLAPPED lpOverlapped
);

CompletionPort :I/O 完成数据包要发布到的 I/O 完成端口的句柄
dwNumberOfBytesTransferred:要通过 GetQueuedCompletionStatus 函数的 lpNumberOfBytesTransferred 参数返回的值
dwCompletionKey:要通过 GetQueuedCompletionStatus 函数的 lpCompletionKey 参数返回的值
lpOverlapped:要通过 GetQueuedCompletionStatus 函数的 lpOverlapped 参数返回的值

BOOL GetQueuedCompletionStatus(
  [in]  HANDLE       CompletionPort,
        LPDWORD      lpNumberOfBytesTransferred,
  [out] PULONG_PTR   lpCompletionKey,
  [out] LPOVERLAPPED *lpOverlapped,
  [in]  DWORD        dwMilliseconds
);

尝试从指定的 I/O 完成端口取消对 I/O 完成数据包的排队。 如果没有完成数据包排队,函数将等待与完成端口关联的挂起 I/O 操作完成
CompletionPort:完成端口的句柄
lpNumberOfBytesTransferred:指向变量的指针,该变量接收在完成的 I/O 操作中传输的字节数
lpCompletionKey:指向变量的指针,该变量接收与 I/O 操作已完成的文件句柄关联的完成键值。 完成键是在对 CreateIoCompletionPort 的调用中指定的每个文件密钥
lpOverlapped:指向变量的指针,该变量接收在启动完成 I/O 操作时指定的 OVERLAPPED 结构的地址
dwMilliseconds:调用方愿意等待完成数据包出现在完成端口上的毫秒数。 如果完成数据包未在指定时间内显示,则该函数超时,返回 FALSE,并将 *lpOverlapped 设置为 NULL

学习例子

GTSever

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值