1.什么是IOCP
IOCP(Input Output Completion Port)输入输出完成端口。其实就是基于重叠I/O的一种改进的模型。
重叠I/O具有缺点:重复调用非阻塞模式的accpet函数和以进入alertablewait状态为目的的SleepEx函数会影响程序性能。
而IOCP提供的解决方案便是:让主线程调用accept函数,单独创建至少一个线程来负责所有I/O的前后处理。
但请不要过分关注在线程上,主要还是如下问题:
1.I/O是否以非阻塞模式工作?
2.如何确定非阻塞模式的I/O是否完成?
2.分阶段实现IOCP程序
2.1 实现原理
IOCP会将已完成的I/O信息注册到CP对象(Completion Port完成端口),而我们就可以通过CP对象来获取I/O是否完成的信息,所以有下面两项工作:
- 创建完成端口对象
- 建立完成端口对象和套接字之间的联系
此时的套接字必须赋予重叠属性。
2.2 创建CP对象
#include<windows.h>
HANDLE CreateIoCompletionPort(
HANDLE fileHandle, //创建CP对象时传递INVALID_HANDLE_VALUE
HANDLE ExistingCompletionPort, //创建CP对象时传递NULL
ULONG_PTR CompletionKey, //创建CP对象时传递0
DWORD NumberOfConcurrentThreads //分配给CP对象的用于处理I/O的线程数。
//例如:该参数为2时,说明分配给CP对象的可以同时运行的线程数最多为2个
//如果为0时,那么系统中CPU的个数就是可同时运行的最大线程数
);
成功返回CP对象句柄
失败返回NULL
2.3 创建和套接字连接完成的端口对象
#include<windows.h>
HANDLE CreateIoCompletionPort(
HANDLE FileHandle, //要连接到CP对象的套接字句柄
HANDLE ExistingCompletionPort, //要连接套接字的CP对象句柄
ULONG_PTR CompletionK