IOCP完成端口与长连接通讯
2006-08-08 13:31
459 查看
最近在写一个通讯代理程序的时候使用了IOCP通讯模型,几年前也使用过IOCP,不过当时的程序是基于短连接的,而这次是长连接的,写这个程序的过程中我觉得主要有以下几点值得注意:
1、整个程序的架构:程序由一个Accept线程,n个工作者线程,1个线程池管理线程,n个业务处理线程构成。Accept线程接收客户端连接并投递WSARecv重叠操作,工作者线程中通过GetQueuedCompletionStatus阻塞收取数据,收取请求数据后将数据放入队列,然后再投递一个WSARecv重叠操作至GetQueuedCompletionStatus阻塞调用,如果是短连接的话,此处就不需要再投递WSARecv重叠操作了,直接调用GetQueuedCompletionStatus收取另一个客户端连接发送过来的数据就可以了。我刚开始也忽略了这一点,导致程序每次只能收取客户端的第一个请求,后面就再也收不到了。
2、可以利用WSARecv和recv结合来完成"包头+数据体"形式的请求包的收取,在我们的程序中,数据体的长度是由包头中的某个参数来指定的,而WSARecv是非阻塞调用的(容易导致包头和数据体被不同的工作者线程收取,重新组装请求很麻烦),在收取这样的请求包时很不方便,于是我先利用WSARecv来收取包头,然后再根据包头中指定的长度调用recv阻塞收取相应长度的数据体,这样虽然性能上带来了一些损失,不过因为组装请求包方面简单很多,耗用的资源更少,总体来看也是值得的。
3、以后再接着补充...
1、整个程序的架构:程序由一个Accept线程,n个工作者线程,1个线程池管理线程,n个业务处理线程构成。Accept线程接收客户端连接并投递WSARecv重叠操作,工作者线程中通过GetQueuedCompletionStatus阻塞收取数据,收取请求数据后将数据放入队列,然后再投递一个WSARecv重叠操作至GetQueuedCompletionStatus阻塞调用,如果是短连接的话,此处就不需要再投递WSARecv重叠操作了,直接调用GetQueuedCompletionStatus收取另一个客户端连接发送过来的数据就可以了。我刚开始也忽略了这一点,导致程序每次只能收取客户端的第一个请求,后面就再也收不到了。
2、可以利用WSARecv和recv结合来完成"包头+数据体"形式的请求包的收取,在我们的程序中,数据体的长度是由包头中的某个参数来指定的,而WSARecv是非阻塞调用的(容易导致包头和数据体被不同的工作者线程收取,重新组装请求很麻烦),在收取这样的请求包时很不方便,于是我先利用WSARecv来收取包头,然后再根据包头中指定的长度调用recv阻塞收取相应长度的数据体,这样虽然性能上带来了一些损失,不过因为组装请求包方面简单很多,耗用的资源更少,总体来看也是值得的。
3、以后再接着补充...
相关文章推荐
- 完成端口通讯服务器(IOCP Socket Server)设计(二)内存管理(AWE)
- 完成端口(IOCP)怎么判断某个连接是否断开
- 完成端口通讯服务器(IOCP Socket Server)设计 (三)不要迷信API(单链表的另一种算法)
- 完成端口(IOCP)怎么判断某个连接是否断开
- 可伸缩的IO完成端口服务器模型(IOCP)(英文版)
- 使用IOCP进行客户socket与完成端口关联操作
- IOCP完成端口介绍及完成端口内部实现
- 完成端口封装(修复Windows 网络与通信程序设计 可伸缩IOCP模型的bug)
- DELPHI中完成端口(IOCP)的简单分析(1)
- 完成端口IOCP,重叠,消息选择,消息异步等等....
- DELPHI中完成端口(IOCP)的简单分析(4)
- 【windows核心编程】IO完成端口(IOCP)复制文件小例前简单说明
- 完成端口(IOCP)编程探讨
- 经调查长期 开关软件端口屏蔽开启 连接查看:网络不安全来之以下IP通讯中间商
- DELPHI中完成端口(IOCP)的简单分析(3)
- DELPHI中完成端口(IOCP)的简单分析(1) 推荐
- DELPHI中完成端口(IOCP)的简单分析(3) 推荐
- 完成端口(IOCP)学习小结
- 完成端口重叠I/O模型的服务器中,如何存储和管理数万个socket句柄—IOCP代码
- 完成端口(IOCP)编程探讨