今天是我第一次接触IOCP,感觉还可以,又学到了一些东西。做了几个实验,对IOCP有了初步的认识。希望自己能够深入的学习下去。现在把今天做的有关事情整理一下。IOCP实验采用的代码是从《WINDOWS网络与通信程序设计》所附的源代码修改而来的(本来想花点钱买这本书,在网上找了一下,发现有免费的电子版下载,让我省了点钱)。
IOCP的全称是I/O Completion Port ,中文叫做I/O完成端口。其实际上就是应用程序采用线程池处理异步I/O请求的一种机制,它可以接收多种对象句柄,如文件对象和套接字对象。
使用完成端口模型,最先调用的函数是:
这个函数在主线程要应用到两次,其作用分别是创建一个完成对象窗口和将一个或多个文件句柄关(可以是SOCKET句柄)联到I/O完成端口对象。如果是第二次用到该函数,那么当中的FileHandle为要关联的套接字句柄,ExistingCompletionPort为上面创建完成的端口对象,CompletionKey为指定句柄唯一数据,它将与FileHandle套接字句柄关联在一起。
如:CreateIoCompletionPort((HANDLE)pPerHandle->s,hCompletion,(DWORD)pPerHandle,0);
下一个要用到的函数是:
向完成端口关联套接字句柄后,便可以在套接字上投递重叠发送和接收请求处理I/O了。在这些I/O操作完成时,I/O系统会向完成端口对象发送一个完成通知封包,I/O完成端口以先进先出的方式给这些封包排队,使用GetQueuedCompletionStatus函数可以取得这些队列当中的封包,如:
BOOL bOK = GetQueuedCompletionStatus(hCompletion,&dwTrans,(LPDWORD)&pPerHandle,(LPOVERLAPPED*)&pPerIO, WSA_INFINITE);
在这些数据当中,最重要的是pPerHandle和pPerIO。lpCompletionKey参数包含了pPerHandle数据,当套接字第一次与完成端口关联时,这个数据就关联到了套接字句柄。lpOverlapped参数指向一个OVERLAPPED结构,结构后面就是pPerIO数据,这可以是工作线程完成封包时想要知道的任何信息。整个GetQueuedCompletionStatus也是工作在工作线程当中的。
总的程序如下:
程序当中加入的一些print函数是为了辅助理解整个数据接收处理过程用的。
大概内容就是如此,还有许多东西需要我去深入理解。