完成端口iocp和重叠端口
2017-05-26 21:50
169 查看
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端:
其中 WSAAccept GetQueueCompletionStatus 是阻塞的,或者说是 事件驱动的,其会在那里等待...
可以看到IOCP里面用到了许多 WSA开头的API,而其创建了多个工作线程,这就是线程池,但是你不用管理,GetQueueCompletionStatus会自动进行管理的.
IOCP与普通socket 两个最重要的不同点 :
IOCP是针对服务器端的,对于客户端,随便,跟普通socket客户端一样.
附上我学习到的例子 非常的简洁:
IOCP 简单 命令行 示例程序(服务器和 6000socket链接 测试客户端)
http://files.cnblogs.com/ayanmw/testiocp2.zip
在附上一篇文章,看完例子 自己理解下,再去看理论:
http://blog.csdn.net/piggyxp/article/details/6922277
其他 IOCP 完成端口 重叠IO的东西 自己搜索吧.
IOCP模型分析:
http://linux.it219.com/archives/214
Windows IOCP模型与Linux EPOLL模块之比较:
http://blog.csdn.net/ljmwork/article/details/7871922
其相当于 异步通信 .普通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 WSACleanup 14 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链接 测试客户端)
http://files.cnblogs.com/ayanmw/testiocp2.zip
在附上一篇文章,看完例子 自己理解下,再去看理论:
http://blog.csdn.net/piggyxp/article/details/6922277
其他 IOCP 完成端口 重叠IO的东西 自己搜索吧.
IOCP模型分析:
http://linux.it219.com/archives/214
Windows IOCP模型与Linux EPOLL模块之比较:
http://blog.csdn.net/ljmwork/article/details/7871922
搜索:iocp linux 获得更多区别
转载请注明出处:http://www.cnblogs.com/ayanmw 我会很高兴的!相关文章推荐
- 完成端口IOCP,重叠,消息选择,消息异步等等....
- IOCP完成端口介绍及完成端口内部实现
- 完成端口重叠I/O模型的服务器中,如何存储和管理数万个socket句柄—IOCP代码
- 今天研究了一下 windows特有的 完成端口 IOCP 重叠IO端口 ,记录下它与普通socket的区别
- 高性能大容量SOCKET并发(二):IOCP完成端口控件封装
- IOCP(完成端口)开发手记(2)
- 一个简单的IOCP(IO完成端口)服务器/客户端类
- 完成端口Iocp与Epoll的区别
- DELPHI中完成端口(IOCP)的简单分析(1) 推荐
- iocp(完成端口)进度复制文件 可暂停 恢复 停止
- DELPHI中完成端口(IOCP)的简单分析(2)
- DELPHI高性能大容量SOCKET并发:IOCP完成端口例子介绍
- 一个简单的IOCP(IO完成端口)服务器/客户端类(2/2)
- 完成端口(IOCP)编程探讨
- DELPHI中完成端口(IOCP)的简单分析(4)
- 一个简单而又灵活的IOCP模块——完成端口通讯服务器(IOCP Socket Server)设计(四)
- 经典代码IOCP(完成端口)的C#.Net实现----解读
- IOCP(完成端口)开发手记(2)
- 统一完成端口Iocp和Epoll
- DELPHI中完成端口(IOCP)的简单分析(2)