IOCP理解

原创 2013年12月06日 10:31:14
以下叙述仅限于网络通信。
所谓完成端口,就是一个队列。
这个队列里面以句柄(网络通信里为socket)为元素,在有消息到达后,通知工作线程(如果队列里的元素有投递请求)进行消息处理。这个流程与select模型相反,select模型是主动查询去获取消息,而iocp则是由windows内核通知工作线程有消息来了你可以进行处理了。
同时,iocp有一个消息队列,其中的每一个消息只会发送给一个工作线程。
具体流程(UDP为例):
1.创建完成端口;
2.启动工作线程;
3.创建socket并与本地端口绑定;
4.将socket句柄关联到完成端口;
5.投递请求;
6.关闭socket句柄;
7.关闭完成端口;
在上述流程中,对于每个socket句柄,3、4、5、6是必须的。而在每个socket的流程中,5步骤必须重复,因为只有先投递请求才能收到响应。

关于完成端口收到消息后的数据处理。
1.创建IO类,该IO类中有存储数据的链表、消息处理回调函数的地址等信息。在该IO类的启动函数(自定义函数)中,创建存储空间并启动消息处理线程,在该线程中调用回调函数处理存储空间中的数据。
2.每个socket句柄关联一个IO类对象,并把该socket的处理收到的消息的函数的地址传给IO类对象。
3.把在工作线程中收到的消息直接存储到IO类对象中,保证工作线程不会阻塞或者耗费很长时间去处理一个消息。
4.该IO类必须能够自动扩展。比如原来的存储空间为1M,现在已经写满了,却都没有处理,然而消息还在源源不断的到来,此时必须扩展存储空间以容纳更多的消息,当然,如何扩展及扩展多少则根据需求决定。
5.该IO类最好能够自动缩减存储空间,在消息比较少的时候释放部分存储空间。

经测试,在每s一万条消息的情况下,iocp服务工作正常。在每s有8-10万条消息的情况下也能保证每条消息都收到,对比select模型简直堪称完美!

由于是用手机,代码就不提供了。

总结:iocp只是MS提供的一个处理模型,至于具体的消息接收、数据处理等则需要自行实现,对于高并发服务器简直是利器。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Winsock的IOCP的初步应用与理解

winsock最主要的功能基于socket套接字,现在学得还不是特明白,有个初步的大概认识,通过同步异步IO方式,适用于不同的网络,现在主要提出几个winsock的关键点。在定义sockaddr_in...

对于TCP协议中IOCP模型的一些简单的理解

请不要觉得这一篇没有代码的文章没意义,对IOCP模型的代码,百度搜索可以得到很多,但是后续很多需要纠结的地方,很多人都经历过,如果你已经在尝试写IOCP服务端了,那么你很可能会对写代码之外的一些设计问...
  • Gnorth
  • Gnorth
  • 2014-09-22 11:00
  • 1807

多种SOKECT通讯模型的理解(select,WSAAsyncSelect,WSAEventSelect,Overlapped I/O 事件通知,Overlapped I/O 完成例程,IOCP)

老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。   这和Socket模型非常类似。下面我就以老陈接收信件为例讲解SocketI/O模型。  ...
  • fion45
  • fion45
  • 2013-10-10 08:35
  • 3955

IOCP的笔记及理解

WIN下最好的网络模型可能就是IOCP完成端口了吧 经过几天的研究可以使用以下比喻来理解完成端口, 完成端口中的完成表示IO操作已经完成后才通知程序,完成端口可以更形象的想象成是完成队列 这里我...

IOCP完成端口模型

  • 2015-02-10 09:25
  • 402KB
  • 下载

iocp服务器

  • 2017-07-25 14:36
  • 116KB
  • 下载

IOCP模型与网络编程

复习下IOCP相关知识,很详细,不错!

IOCP 客户端 demo

  • 2015-11-20 16:50
  • 65KB
  • 下载

iocp服务器的源码

  • 2015-06-12 11:06
  • 31KB
  • 下载

IOCP知识点及疑惑

原文地址:http://hzdiy.iteye.com/blog/778194 1.IOCP发送大数量的问题 有A,B两块数据,如AB两块数据,如果A数据比较大,异步只发送了一部分就返回了,B...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)