UDP服务端-IdUDPServer怎么完成多个人同时传输大量数据? ( 积分: 100 )

  • 主题发起人 主题发起人 yinpengxiang
  • 开始时间 开始时间
Y

yinpengxiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我以前所有大的数据流(100~1000K)包括文件都是通过阻塞式的TCP(IdTCP),通过握手方式完成传输,但是IdUDPServer不能阻塞式的完成应答过程,请问大家有没有好的解决方法?
 
我以前所有大的数据流(100~1000K)包括文件都是通过阻塞式的TCP(IdTCP),通过握手方式完成传输,但是IdUDPServer不能阻塞式的完成应答过程,请问大家有没有好的解决方法?
 
没有人回答,自己顶一下
 
如果可以的话,直接用winsocket2的api,使用WSAEventSelect机制进行接收,是比较好的udp解决方案,可以做出阻塞效果,且无数据时不消耗cpu;当然有精力也可以做成重叠I/O的~
我用WSAEventSelect机制做的视频接收解包合帧程序效果很不错,实时性很高。如果你要同时和多个客户端传输数据,最好用重叠I/O,或者开多端口多线程
 
to islet8:
多线程和完成端口,都必须对UDP包进行重组啊!
现在的问题就是有没有好的办法,对每个客户端的发送数据不需要重组,就像TCP的每个连接对应一个线程,我只需要在线程里面对每个UDP包进行简单的组合就行了???
 
有技術含量。頂
 
大数据用udp是肯定要拆包的,1k之内的包一般都不会丢;所以不可能不需要重组(除非网络环境非常好,udp的理论包大小可以比较大,但也远远没达到你所需的100k的大小)
你用完成端口的话那就是用多线程GetQueuedCompletionStatus()等待,根据返回的lpCompletionKey判断是哪个socket上来的数据,放到该socket自己的缓冲区里去合包,后面对每个socket开一个线程监视自己的缓冲区,如果一个完整包被合并成功(可以用事件)就进行后面的处理
不知道我理解你的意思对不对?
 
to islet8:
还是UDP的包重组和重发问题比较复杂。
而且为每个UDP客户端建立一个缓冲,那服务器还是受不了的!
我的ERP系统客户端可能有3000~2000左右。
 
3000~2000(0)?少了个0吧?
这个是你的客户量吧?瞬时并发量有多少?
另外,客户端上来的udp都是走同一个端口进来的,而不是像tcp那样分端口处理,所以我原先就是对每个远程客户端(根据ip或者是数据包(经过分包的小包)头里的客户端编号)建立一个缓冲区,根据(小)包头的小包编号往该缓冲区中指定下标的内存块中写
合包是没难度的,但是难在你的数据传输机制上。我不清楚你的erp怎么会要往服务器里传这么大的数据(1MB)?这种在网络不好的情况下如果传输反馈处理的不好,丢包可能很多,或者速度很慢。。
还有就是一台服务器的承受能力本来就是有限的,我感觉你的客户端不应该是3000个同时并发传1MB这么多数据吧,每个单位时间里需要传数据的客户端应该不会很多,如果真的很多一台服务器是肯定不够的~
 
to islet8,
传输机制我已经解决了,只需要多一个唯一ID来区分,但是这个缓冲比较难维护,如果每次任务建立一个ID的话,那么如果这次任务异常等情况,服务端不知道这个任务何时结束了,这样需要对每个任务进行开一个线程了?
 
我现在的处理方法是,在每个任务里都有一个“最后操作时间戳”,另外开一个线程定时轮询所有存在的任务,判断哪些已经处于“操作超时”,即认为该任务已出现异常,然后终止该任务并释放内存等

加你了
 
to islet8,
这样的话,如果任务数很多的时候,一个轮训就会占很多CPU啊
 
我下午说的那个方法你如果做出了类似的程序,而且运行效率还行的话,跟我也通知一声,这么大的数据量我也还没做过,长点经验:)
 
呵呵,做了一下,还是上不了30000,IOCP-tcp可以支持7200左右
UDP的算法还是比较麻烦,今天下午揭帖了
这些富翁们是不想回答,还是懒得回答,我们还是到MSN上说吧
 
30000并发不够么?如果换成小型机的话容量能增多少?
:)
 
如果换成小型机,跑windows就不合算了,可能服务端程序就得改了;
他们用C++写的用IOCP的TCP连接,最多到了10000个连接,我用Delphi弄了一下到不了5000;
UDP方式没有试过;
 
讨论这么久除了 islet8 好像没有人愿意回答,揭帖吧
 
后退
顶部