每客户开一个线程处理和异步IO(事件模型) 谁实用?

konfyt 2010-12-07 02:43:00
我的应用平台是WINCE, 读取和控制RS485设备.
我将设备层做一个服务, 接收大家的控制, 服务读到数据, 并广播给每个连接的客户端.

现在有2种方式响应客户端连接;
1.accept 后, 每个客户端开个线程处理应答.
例如: 基于TCP/IP的局域网多用户通信; http://www.vckbase.com/document/viewdoc/?id=349


2.采用异步IO WSAEventSelect 来实现;
例如: http://blog.csdn.net/wanjingwei/archive/2009/06/29/4306609.aspx


我的应用实际情况是, 客户端通常只有1~2个, 因为是CE, 最大不容许超过5个. 都属于长时间连接.

所以我觉得方式1更加适合我的情况,

方式2的问题在于:
当同时有2个客户端发了消息, 只能等第一个处理完后, 再处理第二个, 实时性似乎不够好.


大家觉得呢?
...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
周江涛 2010-12-08
  • 打赏
  • 举报
回复
单线程多连接(<64个),用select模型就可以了,简单高效.吞吐量大
zzw820626 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wbruce 的回复:]

如果客户端很少,第一种方式自然是最好的,无论从性能还是编程角度来说。
如果客户端比较多自然要考虑第二种,如果客户端更多的时候select的性能较差,可以考虑iocp或者linux下的epoll。
至于你说的第二种实时性不好,其实是有办法避免的,你可以将真正的业务处理由单独的线程去处理,而网络模块只是接受发送数据,互不相干,这样的效率是没问题的。
[/Quote]
++
wbruce 2010-12-07
  • 打赏
  • 举报
回复
如果客户端很少,第一种方式自然是最好的,无论从性能还是编程角度来说。
如果客户端比较多自然要考虑第二种,如果客户端更多的时候select的性能较差,可以考虑iocp或者linux下的epoll。
至于你说的第二种实时性不好,其实是有办法避免的,你可以将真正的业务处理由单独的线程去处理,而网络模块只是接受发送数据,互不相干,这样的效率是没问题的。
varding 2010-12-07
  • 打赏
  • 举报
回复
我觉得第二个方法更简单

如果客户端同时发数据了这2个方法没啥区别,只不过第一种方法是把时间掰成两半用而已,需要的总时间不会有差别的
Eleven 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 konfyt 的回复:]
我的应用平台是WINCE, 读取和控制RS485设备.
我将设备层做一个服务, 接收大家的控制, 服务读到数据, 并广播给每个连接的客户端.

现在有2种方式响应客户端连接;
1.accept 后, 每个客户端开个线程处理应答.
例如: 基于TCP/IP的局域网多用户通信; http://www.vckbase.com/document/viewdoc/?id=349


2.……
[/Quote]
select模型也可以
konfyt 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liuxiaoyi666 的回复:]
iocp .....

根据你的情况第一种也很好,实际情况是开启太多的线程是没有好处的

所以一般建议线程池...
[/Quote]

因为是WINCE平台, 好像不支持IOCP
mayudong1 2010-12-07
  • 打赏
  • 举报
回复
收到的数据要向所有连接的客户端转发,必然就有一个顺序的问题了
因为连接数很少,两种方法都没什么区别吧
  • 打赏
  • 举报
回复
iocp .....

根据你的情况第一种也很好,实际情况是开启太多的线程是没有好处的

所以一般建议线程池...

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧