Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-04 #1 我以前所有大的数据流(100~1000K)包括文件都是通过阻塞式的TCP(IdTCP),通过握手方式完成传输,但是IdUDPServer不能阻塞式的完成应答过程,请问大家有没有好的解决方法?
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-04 #2 我以前所有大的数据流(100~1000K)包括文件都是通过阻塞式的TCP(IdTCP),通过握手方式完成传输,但是IdUDPServer不能阻塞式的完成应答过程,请问大家有没有好的解决方法?
I islet8 Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-06 #4 如果可以的话,直接用winsocket2的api,使用WSAEventSelect机制进行接收,是比较好的udp解决方案,可以做出阻塞效果,且无数据时不消耗cpu;当然有精力也可以做成重叠I/O的~ 我用WSAEventSelect机制做的视频接收解包合帧程序效果很不错,实时性很高。如果你要同时和多个客户端传输数据,最好用重叠I/O,或者开多端口多线程
如果可以的话,直接用winsocket2的api,使用WSAEventSelect机制进行接收,是比较好的udp解决方案,可以做出阻塞效果,且无数据时不消耗cpu;当然有精力也可以做成重叠I/O的~ 我用WSAEventSelect机制做的视频接收解包合帧程序效果很不错,实时性很高。如果你要同时和多个客户端传输数据,最好用重叠I/O,或者开多端口多线程
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-07 #5 to islet8: 多线程和完成端口,都必须对UDP包进行重组啊! 现在的问题就是有没有好的办法,对每个客户端的发送数据不需要重组,就像TCP的每个连接对应一个线程,我只需要在线程里面对每个UDP包进行简单的组合就行了???
to islet8: 多线程和完成端口,都必须对UDP包进行重组啊! 现在的问题就是有没有好的办法,对每个客户端的发送数据不需要重组,就像TCP的每个连接对应一个线程,我只需要在线程里面对每个UDP包进行简单的组合就行了???
I islet8 Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-11 #7 大数据用udp是肯定要拆包的,1k之内的包一般都不会丢;所以不可能不需要重组(除非网络环境非常好,udp的理论包大小可以比较大,但也远远没达到你所需的100k的大小) 你用完成端口的话那就是用多线程GetQueuedCompletionStatus()等待,根据返回的lpCompletionKey判断是哪个socket上来的数据,放到该socket自己的缓冲区里去合包,后面对每个socket开一个线程监视自己的缓冲区,如果一个完整包被合并成功(可以用事件)就进行后面的处理 不知道我理解你的意思对不对?
大数据用udp是肯定要拆包的,1k之内的包一般都不会丢;所以不可能不需要重组(除非网络环境非常好,udp的理论包大小可以比较大,但也远远没达到你所需的100k的大小) 你用完成端口的话那就是用多线程GetQueuedCompletionStatus()等待,根据返回的lpCompletionKey判断是哪个socket上来的数据,放到该socket自己的缓冲区里去合包,后面对每个socket开一个线程监视自己的缓冲区,如果一个完整包被合并成功(可以用事件)就进行后面的处理 不知道我理解你的意思对不对?
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-11 #8 to islet8: 还是UDP的包重组和重发问题比较复杂。 而且为每个UDP客户端建立一个缓冲,那服务器还是受不了的! 我的ERP系统客户端可能有3000~2000左右。
I islet8 Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-11 #9 3000~2000(0)?少了个0吧? 这个是你的客户量吧?瞬时并发量有多少? 另外,客户端上来的udp都是走同一个端口进来的,而不是像tcp那样分端口处理,所以我原先就是对每个远程客户端(根据ip或者是数据包(经过分包的小包)头里的客户端编号)建立一个缓冲区,根据(小)包头的小包编号往该缓冲区中指定下标的内存块中写 合包是没难度的,但是难在你的数据传输机制上。我不清楚你的erp怎么会要往服务器里传这么大的数据(1MB)?这种在网络不好的情况下如果传输反馈处理的不好,丢包可能很多,或者速度很慢。。 还有就是一台服务器的承受能力本来就是有限的,我感觉你的客户端不应该是3000个同时并发传1MB这么多数据吧,每个单位时间里需要传数据的客户端应该不会很多,如果真的很多一台服务器是肯定不够的~
3000~2000(0)?少了个0吧? 这个是你的客户量吧?瞬时并发量有多少? 另外,客户端上来的udp都是走同一个端口进来的,而不是像tcp那样分端口处理,所以我原先就是对每个远程客户端(根据ip或者是数据包(经过分包的小包)头里的客户端编号)建立一个缓冲区,根据(小)包头的小包编号往该缓冲区中指定下标的内存块中写 合包是没难度的,但是难在你的数据传输机制上。我不清楚你的erp怎么会要往服务器里传这么大的数据(1MB)?这种在网络不好的情况下如果传输反馈处理的不好,丢包可能很多,或者速度很慢。。 还有就是一台服务器的承受能力本来就是有限的,我感觉你的客户端不应该是3000个同时并发传1MB这么多数据吧,每个单位时间里需要传数据的客户端应该不会很多,如果真的很多一台服务器是肯定不够的~
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-13 #10 to islet8, 传输机制我已经解决了,只需要多一个唯一ID来区分,但是这个缓冲比较难维护,如果每次任务建立一个ID的话,那么如果这次任务异常等情况,服务端不知道这个任务何时结束了,这样需要对每个任务进行开一个线程了?
to islet8, 传输机制我已经解决了,只需要多一个唯一ID来区分,但是这个缓冲比较难维护,如果每次任务建立一个ID的话,那么如果这次任务异常等情况,服务端不知道这个任务何时结束了,这样需要对每个任务进行开一个线程了?
I islet8 Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-12 #11 我现在的处理方法是,在每个任务里都有一个“最后操作时间戳”,另外开一个线程定时轮询所有存在的任务,判断哪些已经处于“操作超时”,即认为该任务已出现异常,然后终止该任务并释放内存等 加你了
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-12 #12 to islet8, 这样的话,如果任务数很多的时候,一个轮训就会占很多CPU啊
I islet8 Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-12 #13 我下午说的那个方法你如果做出了类似的程序,而且运行效率还行的话,跟我也通知一声,这么大的数据量我也还没做过,长点经验:)
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-13 #14 呵呵,做了一下,还是上不了30000,IOCP-tcp可以支持7200左右 UDP的算法还是比较麻烦,今天下午揭帖了 这些富翁们是不想回答,还是懒得回答,我们还是到MSN上说吧
I islet8 Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-13 #15 30000并发不够么?如果换成小型机的话容量能增多少?
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-13 #16 如果换成小型机,跑windows就不合算了,可能服务端程序就得改了; 他们用C++写的用IOCP的TCP连接,最多到了10000个连接,我用Delphi弄了一下到不了5000; UDP方式没有试过;
Y yinpengxiang Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-13 #17 讨论这么久除了 islet8 好像没有人愿意回答,揭帖吧