初探IOCP

今天是我第一次接触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函数是为了辅助理解整个数据接收处理过程用的。

 

大概内容就是如此,还有许多东西需要我去深入理解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值