有好几千个客户端,每隔一个小时往服务端发一个包,如何设计好一点

我看你有戏 2008-02-24 09:28:55

有好几千个客户端,每隔一个小时往服务端发一个包,如何设计好一点

给个思路吧,我现在 是服务端给每个客户端开一个线程

结果服务端老是爆了

需要看哪方面的知识呢
...全文
315 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hwsts2 2008-03-06
  • 打赏
  • 举报
回复
最好使用UDP
如果非要用TCP,简单的的模型可能就是 多Thread去select,select有限制,好像只能select 64个SOCKET 需要,当然这个可以解决,这个这种模型的一个难点,就是Thread之间的负载平衡问题。
snowshow 2008-03-06
  • 打赏
  • 举报
回复
就这点数据量
随便一个模型就搞定了

要是我就用UDP做,加上时间戳,一个包发10次。
feihu1983 2008-03-04
  • 打赏
  • 举报
回复
设计服务器 要看你的连接并发量 你的这个量 用事件模型都行 要是想完善 就IOCP 用线程池那就太没必要了 (消息队列不支持DOS 下的东西
zhengv 2008-03-04
  • 打赏
  • 举报
回复
我用IOCP写的一个http web服务器源码,在vc6+sp6下编译,性能还不错。跟你这个模式很相像,可以参考一下。

http://blog.csdn.net/zhengv/archive/2007/12/04/1915244.aspx
我看你有戏 2008-03-04
  • 打赏
  • 举报
回复
控制台程序用CAsynSocket怎么用啊,搞不来啊
nizhaorong 2008-02-26
  • 打赏
  • 举报
回复
DING,重叠IO, TCP/UDP, 线程池?(一个小时就没必要了?)
sxcong 2008-02-26
  • 打赏
  • 举报
回复
“好几千个”,CAsynSocket都支持几千个
“每隔一个小时发一次”
这样的要求一个线程就足够了,用不到池。
UDP不错,TCP也可以,反正一个小时才connect一下,不影响带宽。
为了方便可以直接用CAsynSocket,或者codeproject上面有个支持代理的socket类
我看你有戏 2008-02-26
  • 打赏
  • 举报
回复
讲了这么多了,先谢谢大家的回帖

最好给我个demo,不要用基于MFC的

直接用控制台程序写一个吧,谢谢大虾们
僵哥 2008-02-26
  • 打赏
  • 举报
回复
来个请求开个线程好了,搞个线程记数器,起一个线程+1,线程里执行最后一个语句的时候把线程数目-1,最多让他开200个线程,这样不就好了啊。
==========
做成固定线程的迭代服务器就好了。
开N个线程去Accept,Accept之后就去服务,服务完或者中间出错,间隔一段时间没有命令,就断开(防止恶意连接),再Accept。
zh1369 2008-02-26
  • 打赏
  • 举报
回复
iocp
football 2008-02-26
  • 打赏
  • 举报
回复
来个请求开个线程好了,搞个线程记数器,起一个线程+1,线程里执行最后一个语句的时候把线程数目-1,最多让他开200个线程,这样不就好了啊。
annvily 2008-02-25
  • 打赏
  • 举报
回复
设计服务器模型,重叠I/O。。。
僵哥 2008-02-25
  • 打赏
  • 举报
回复
一般有三种方式。
1、用UDP协议,服务器监听固定的一个端口,收到数据后回发一个数据包告知客户端,如客户端在一定时间内未收到服务器的回应,则自动重发。
2、用TCP协议,服务器监听固定的一个端口,客户端要发送数据时连接服务器,若连接失败则延时一定时间后重试,发送完数据后断开连接。
3、用TCP或UDP协议,客户端监听固定的一个端口,每隔一小时由服务器主动连接客户端索取数据包。
=================
1.这个处理并不一定就能改善楼主的问题,楼主的问题在于处理上面出现问题,而不是如何处理.
2.这个完全脱离了楼主的问题.
3.这里面得理清楚什么是服务器什么是客户机了.并不因为众多就是客户机.通常客户机是一个服务的要求者,服务器才是服务的提供者.
cnzdgs 2008-02-24
  • 打赏
  • 举报
回复
一般有三种方式。
1、用UDP协议,服务器监听固定的一个端口,收到数据后回发一个数据包告知客户端,如客户端在一定时间内未收到服务器的回应,则自动重发。
2、用TCP协议,服务器监听固定的一个端口,客户端要发送数据时连接服务器,若连接失败则延时一定时间后重试,发送完数据后断开连接。
3、用TCP或UDP协议,客户端监听固定的一个端口,每隔一小时由服务器主动连接客户端索取数据包。
jwybobo2007 2008-02-24
  • 打赏
  • 举报
回复
恩,线程池的做法蛮不错的,本身多线程不是真正意义上的同时进行(除非多核处理器)
我看你有戏 2008-02-24
  • 打赏
  • 举报
回复



是这样的基本上发一个包后,服务端就把客户端断开了的
WinEggDrop 2008-02-24
  • 打赏
  • 举报
回复
新学编程?你服务端给每个客户开一线程自然要挂.如果在windows下,默认一个进程最多只能开2028线程(到msdn中查看CreateThread相关资料).换个模式就是.Asynchronous,IOCP等模型都是解决方法.
abuseyoudna1981 2008-02-24
  • 打赏
  • 举报
回复
才发那么一个包,你就爆了,可怜的家伙,用线程池+消息队列.
僵哥 2008-02-24
  • 打赏
  • 举报
回复
使用线程池,而不是一个用户一个线程.否则每一个进程,甚至是整个操作系统,所能同时运行的线程数是有限的.能够开到三千多个线程已经不错了.采用线程池机制,将请求放入队列当中,线程池当中的线程轮循处理.
china_bai 2008-02-24
  • 打赏
  • 举报
回复

在服务器端开一个线程监听,收到一个数据包,开一个线程发送响应数据即可。
每次收到一个包后,回送一个响应,表示接收完毕,响应完毕后,线程结束。


发送方在一定的时间没收到响应后,则自动对数据进行一次重发,知道收到响应。

另外就是要使用UDP方式,没必要使用TCP连接。
加载更多回复(3)

18,356

社区成员

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

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