讨论~ 多线程服务器模型?

huangzhtao 2011-05-12 12:02:49
加精
现需要实现以下功能:
1. 一个服务器端等待多个客户机的连接(客户机数目小于20个),客户机发起连接时间不确定;
2. 服务器端处理某些事件,处理完成后向所有连接的客户机发送处理结果,处理结果大小在1K~2K之间,也有可能是很小的一个数据;事件产生速度为每秒30次左右,也就是每秒30K~60K;
3. 处理结果要求尽可能实时发送到客户机上;
4. 处理结果可以有部分丢失的,但要求丢失率尽可能低;
5. 用Windows VC 实现。

这个模型应该如何去实现?
一个服务器,多个客户机去连接,数量又不是很多,一般多线程处理应该就可以了,关键是如何将数据准确发送到客户机上,这个问题我一直没有想明白解决方法,请各位大侠多多指教。


...全文
1585 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangzhtao 2011-06-02
  • 打赏
  • 举报
回复
哇哈哈,今天没有上来看,发现居然被推荐了,也谢谢这么多童鞋的意见。
关于处理掉线的问题,我采用了“骆驼算法”(居然被我想到在操作系统学过的,借用啦 ^_^),反正连接也那么少,开个稍微大点的数组存客户端信息,不管掉线了的,掉了再连的就把认为掉线的客户端掉线了,然后信息给更新了。我的应用也正好每台机器就跑一个,如果需要支持一台多个客户端的话,就还是采用前面有人说的用心跳机制来保证,反正没有用,等下次需要了再实现了。
数据同步问题,数据产生和发送线程之间通过事件来同步;在内网,整了个千兆路由,通讯数据量上保障了。目前看应用跑的好比较稳定,没有出现大的问题。

最后结贴给分啦。
hps9743003 2011-05-26
  • 打赏
  • 举报
回复
就那么几个连接还用IOCP
hps9743003 2011-05-26
  • 打赏
  • 举报
回复
无知的人类呀,楼主关心的是掉线和客户端网络阻塞等问题,较简单的解决方式是:
给每个连接建立一个缓冲队列,由每个SOCKET控制其数据发送的速度

如果复杂点,那就将连接与客户端ID分开存放,在用户登录时建立对应关系,消息放到客户端ID数据结构中,当用户上线时能够继续发送数据。
saintwang 2011-05-25
  • 打赏
  • 举报
回复
看一下window网络编程 第五章winsock IO方法。个人觉得重叠IO比较合适,可以保证性能
b048010532 2011-05-24
  • 打赏
  • 举报
回复
不错 还可以
garping 2011-05-24
  • 打赏
  • 举报
回复
多线程服务器模型,如果并发量不大的话,可用SELECT模型简单实用,如果大并发量的话,就改用事件模型,或者IOCP,epoll等
tx183584 2011-05-23
  • 打赏
  • 举报
回复
dvlinker 2011-05-23
  • 打赏
  • 举报
回复
顶一个先!
jizhehaha 2011-05-23
  • 打赏
  • 举报
回复
学习了
butter0000 2011-05-23
  • 打赏
  • 举报
回复
攒分,攒分!!
CppCoder 2011-05-22
  • 打赏
  • 举报
回复
找个现成的改改好了,20个CLIENT局域网访问,很多办法的

SunFlower 2011-05-20
  • 打赏
  • 举报
回复
IOCP是什么技术啊?我是菜鸟
draracle 2011-05-20
  • 打赏
  • 举报
回复
的确是一个很简单的需求,但是也没那么简单。

1)TCP还是UDP?还是推荐用TCP,虽然在局域网内,环境很良好,但是也不能保证不存在闪断或者其他异常情况,UDP用起来方便,但是代码却不方便,而且还有封包大小限制因素,基于你要求的每帧1-2K的大小,还得自己做顺序检查,心跳等。其实总的来讲,一个好的UDP实现,比TCP还麻烦。除非你的应用不太关心数据的正确性。

2)网络IO模型?IO模型是干什么用的?IO模型就是为了处理多SOCKET的情况下,监控连接、发送、接受事件,以及监控SOCKET状态用的,Windows有几种常用的IO模型,SELECT, OVERLAP, IOCP,你的应用,SELECT就可以支撑,SELECT其实是典型的发布者/工作者线程模式,单线程也可以工作,但扩展性和实时性略差,如果你能保证将来不会再扩展用户数量,而且对数据的实时性要求不强,还是可以选择这个模型。毕竟简单。其实如果说单纯从技术角度而言,还是IOCP最优秀,编码复杂一些,但是扩展性,还有性能都异常优秀。

3)发送数据,发送数据不会强制由IO模型的工作线程来做,也可以由应用层的线程(1-n个)来做,而且还可以减少IO模型工作线程的压力。但是必须要保证在使用一个SOCKET发送数据时,使用临界区保护。另外,异步模式下,要注意发送数据的缓冲区要等待发送完成后,再回收缓冲区,建议用带智能指针的缓冲区。

4)接受数据,IO模型会将数据接受事件通知到IO工作线程,或者说IO工作线程的主要工作就是监控IO上的事件。接收数据时,特别要注意的是,不要让工作线程有太重的负担。例如每一次接收到的数据,最好为每一个链接准备一个流对象,然后将接受到的数据insert back到流数据的末尾。然后由应用层自行拼接流和切割封包。另外特别要注意的是:对每一个SOCKET,只允许一个线程对它投递接受数据请求,效率完全没问题!多线程投递只会导致数据的混乱。

5)其他:最好使用内存池,内存池能极大的提升IO的性能。特别是alloc free特别密集的场合。最后,给一个建议:IO模型复杂的不是编码,而是一个良好的设计。要做得好,呵呵,可以说是一个小工程。
a4974 2011-05-20
  • 打赏
  • 举报
回复
学习。。。。
xl852853 2011-05-20
  • 打赏
  • 举报
回复
阿sodhas机会大家快乐
yuanchengdaili 2011-05-20
  • 打赏
  • 举报
回复
您好,请教您一个问题!远程登录服务器,上网,在不查服务器日志的情况下,有没有可能查到真正的ip? 排除黑客偷日志,警方强端掉服务器的情况。
跟网站有数据交流,就可以跟踪数据,查到真正ip,是吗?
O(∩_∩)O谢谢!
safeqq4 2011-05-20
  • 打赏
  • 举报
回复
我倒是觉得用组播 然后CRC16校准 序列号包 可以满足实时要求和程序效率
charestly 2011-05-20
  • 打赏
  • 举报
回复
学习。。。。。
king_ss_ 2011-05-19
  • 打赏
  • 举报
回复
这个用Winsock服务器端线程池技术解决比较好。具体应用查阅相关书籍,也可以搜一下。
xjq2011 2011-05-19
  • 打赏
  • 举报
回复
看看,你知道的
加载更多回复(54)

18,356

社区成员

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

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