网络上有非常详尽的文章,见http://blog.csdn.net/piggyxp/article/details/6922277,感谢他。
完成端口是MS提供的异步通知队列模型,可用于文件读写,管道,网络通讯等,这里只涉及到网络(socket)使用完成端口。
A.完成端口使用主要步骤
- 主线程端步骤
- 创建完成端口
- 创建监听套接字,绑定完成端口
- 创建工作者线程
- 投递accept请求
- ------销毁资源开始-----
- 发送退出通知至工作线程,等待工作线程退出
- 关闭完成端口
- 关闭所有活动的套接字
- 工作者线程步骤
- 等待完成端口事件
- 完成事件到来,根据不同的事件处理
- 投递新的请求
B.主线程步骤
使用windows socket库需使用如下初始化
int WSAStartup(
__in WORD wVersionRequested,
__out LPWSADATA lpWSAData
);
退出时需要做如下清理
int WSACleanup(void);
创建完成端口
HANDLE WINAPI CreateIoCompletionPort(
__in HANDLE FileHandle,
__in HANDLE ExistingCompletionPort,
__in ULONG_PTR CompletionKey,
__in DWORD NumberOfConcurrentThreads
);
-
FileHandle
-
需要关联的句柄,可以是文件/管道/套接字。设置为NULL表示新创建一个IOCP句柄。
ExistingCompletionPort
-
新创建IOCP的情况下,此处设置为NULL,否则应设置为想关联之IOCP句柄。
CompletionKey
-
用户自定义参数,与每一个句柄相关联。此处用于可以记录每一个套接字相关的信息。
NumberOfConcurrentThreads
-
完成端口最大调度工作线程数。当有网络数据到达时,完成队列会唤醒工作线程进行处理。这个参数用于记录可同时唤醒的线程数。置0标识使用计算机CPU核心个数。
创建监听套接字,绑定完成端口
SOCKET WSASocket(
__in int af,
__in int type,
__in int protocol,
__in LPWSAPROTOCOL_INFO lpProtocolInfo,
__in GROUP g,
__in DWORD dwFlags
);
WSASocket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP,