每客户开一个线程处理和异步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个客户端发了消息, 只能等第一个处理完后, 再处理第二个, 实时性似乎不够好.


大家觉得呢?
...全文
87 点赞 收藏 8
写回复
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日
收到的数据要向所有连接的客户端转发,必然就有一个顺序的问题了
因为连接数很少,两种方法都没什么区别吧
回复 点赞
笨笨兔兔兔兔兔 2010年12月07日
iocp .....

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

所以一般建议线程池...
回复 点赞
发动态
发帖子
网络编程
创建于2007-09-28

7881

社区成员

6.4w+

社区内容

VC/MFC 网络编程
社区公告
暂无公告