在看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