博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
今天研究了一下 windows特有的 完成端口 IOCP 重叠IO端口 ,记录下它与普通socket的区别...
阅读量:4625 次
发布时间:2019-06-09

本文共 1476 字,大约阅读时间需要 4 分钟。

windows下的IOCP和 linux下的epoll(#epoll我还没有研究过#) 都是属于socket 网络编程的范畴.不过其特色是:用固定很少的线程去管理成千上万个socket连接.

其相当于 异步通信 .普通socket是同步,同步 可能要一个线程一个socket链接 去做,由于系统可以运行的线程数目有限,其就成为一个瓶颈了. IOCP/epoll 可以解决这个问题.

首先,你要懂得普通socket TCP的用法:

Serve端 WSAStartup,socket,bind listen,accept. accept之后就是阻塞的recv和send了.WSACleanup  .其中accept之后可以CreateThread 工作线程 来单独处理recv和send.

client端 WSAStartup,socket,connect. connect之后就是阻塞的recv和send了.WSACleanup

而IOCP是这样的:

Server端:

1 WSAStartup 2 CreateIoCompletionPort创建完成端口 3 GetSystemInfo获取CPU核心数目, 4 CreateThread创建CPU核心数目个工作线程,  5 WSASocket  ,  6 bind , 7 listen ,  8  // 一下都在循环内 9 WSAAccept  , 10 CreateIoCompletionPort 创建accept的SocketID与前面完成端口的绑定 , 11 WSARecv投递操作(其实就是必须先接受一次数据,否则后面接受不到,不知道为什么) ,12 //循环结束13 WSACleanup14 15 16 其中 工作线程 有不同的地方17 GetQueuedCompletionStatus 获得数据,然后根据数据来决定 是WSARecv 还是 WSASend

其中 WSAAccept GetQueueCompletionStatus 是阻塞的,或者说是 事件驱动的,其会在那里等待...

可以看到IOCP里面用到了许多 WSA开头的API,而其创建了多个工作线程,这就是线程池,但是你不用管理,GetQueueCompletionStatus会自动进行管理的.

IOCP与普通socket 两个最重要的不同点 :

一个就是 GetQueueCompletionStatus ,这里是阻塞的,根据接受的数据来WSARecv or WSASend.而普通的socket是直接在recv 和 send 阻塞的.IOCP 则不需要这样.另一个就是前面的 WSAAccept ,这个接受到新的客户端连接后,必须 先进行一次 WSARecv. 后续客户端发送的数据 则是上面的GetQueueCompletionStatus 来做了.

IOCP是针对服务器端的,对于客户端,随便,跟普通socket客户端一样.

 

 

附上我学习到的例子 非常的简洁:

IOCP 简单 命令行 示例程序(服务器和 6000socket链接 测试客户端)

 

在附上一篇文章,看完例子 自己理解下,再去看理论:

其他 IOCP 完成端口 重叠IO的东西 自己搜索吧.

IOCP模型分析:

Windows IOCP模型与Linux EPOLL模块之比较:

搜索:iocp linux 获得更多区别

转载于:https://www.cnblogs.com/ayanmw/archive/2012/10/11/2720393.html

你可能感兴趣的文章
HDU 1988 Cube Stacking (数据结构-并查集)
查看>>
iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期...
查看>>
爬虫篇
查看>>
mysql六:数据备份、pymysql模块
查看>>
docker-compose 案例
查看>>
数据结构之哈夫曼树
查看>>
ios 图片裁剪修改尺寸的方法总结
查看>>
待看数据类型
查看>>
DELPHI中 screen.Cursor:=crhourglass; adoQuery.close; adoquery.Open; screen.Cursor:=crdefault;啥意思...
查看>>
JavaScript 判断变量是否为数组Array的方法
查看>>
BZOJ 1602 USACO 2008 Oct. 牧场行走
查看>>
activiti 核心API
查看>>
获取DataTable前几条数据
查看>>
面试题
查看>>
“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误 (转别人)
查看>>
20145313张雪纯《信息安全系统设计基础》第9周学习总结
查看>>
CC_CALLBACK原理及应用
查看>>
常用的input样式美化。
查看>>
SQL Server 错误:924 解决方法
查看>>
win7 下 vim字体默认设置
查看>>