如何使用UDP传送数据给一千个客户端? (300分)

  • 主题发起人 主题发起人 truest9
  • 开始时间 开始时间
我试了一下,udp传送1600bytes1000次如果不管收到没有只需0.7秒,
如果有应答则需要7。1秒。没有用多线程
 
你有没有注意CPU占用率?
我是创建了几十个UDPClient,然后不停的发送
 
CPU占用率几乎没有,我是在两台计算机上,一为客户,一为server,c-->s 发送1000次1.6k
有应答7s,no 0.7
server 开 threadevet ,有应答2s,no 0.151s
 
能否让我看看您的测试代码?
 
建议:
1)直接用api,不用控件,
2)Cache好每一个要发送对象的地址,sockAddrIn格式的,不用每次都转换
3)只要一个socket就够了,用sendto(...);
 
to sofox:
您的建议非常好,我刚刚领悟到这样做的好处
我正在编写具体的实现代码
对于您说的第一步(直接用API,不用控件),是否是指
用fSock := Socket(AF_INET, SOCK_DGRAM, pPE.p_proto);之类的语句创建Socket进行发送?
 
我就是用indy的demo稍加改动试的。
 
to 蒋劲刚:
不知道您的测试能否真实反映我所说情况
服务器端的语音数据是一直不断的
所以必须保证每一个客户端都能够非常快的接收到数据,以便及时回放
还请指教
 
我曾经写过一个局域网内的语音电话程序,
我想只要你不用每次去连接每个客户端的话,
传输速率应该没有问题。
 
to 蒋劲刚:
是的,用UDP就不需要去连接客户端了,只管往客户端的IP和端口发送数据就OK了
我这就试着写代码,按 sofox 的建议,估计明天晚上可以写好
我担心的就是CPU占用率的问题
 
直接用api,不用控件,是不是
用fSock := Socket(AF_INET, SOCK_DGRAM, pPE.p_proto);之类的语句创建Socket进行发送?
 
哇靠!1000人的世界网络大会! 好气派啊!就算是局域网,不用多播也做不到啊!
 
谢谢各位
程序已经写出来了,在本地100M局域网测试时
超过七百个客户连接,两秒钟搞定
音质与单个连接时一样
服务器(P4 2G,256M DDR)CPU占用率为20%
网络流量为 1.5M/S
使用一个Indy UDP控件单线程发送音频
各位帮忙出点子优化程序,就要派送分啦
 
http://61.132.118.185:8080/dispdocnew.php?t=&id=4043
用我的UDP控件试试!有DEMO的
 
to 张无忌:
好的,写好后我把比较的结果贴出来
 
to 张无忌:
实在是不好意思,我折腾了大半天,还没有装上您的控件
我使用的是D6
之前我曾经另外装过Winsock2.pas
是否要注意什么,还请指点
 
你修改哪个bpk文件旧可以了,吧哪个winsock2.pas的路径修改一下旧可以了
 
倒,资源占用率100%是网络数据流量的关系吗?
呵呵,
是你两个发送之是没有间隔引起的
 
to 张无忌:
程序写好了,用您的控件发送语音,也是建立了七百多个客户
但那种感觉就好像给一个人发送一样,哈哈,速度极快,循环发送
一次估计不到一秒,不过数据流量还是一样的。
网络使用率为 8%
CPU占用率为 15% (比Indy的UDP稍低)
总之两字,厉害!
我得解剖学习一下,呵呵!
 
http://61.132.118.185:8080/dispdocnew.php?id=4228
这个版本可以供 D5/D6/D7使用
 
后退
顶部