如题!
如何接收,才能顺利处理机器收到的所有数据包?

解决方案 »

  1.   

    问题 不清。丢包再于网络条件,如果你的网络出口只有1m的话,谈不上800m,就说2m都会丢光。如果是kM网的话,在局域网内保证udp大一些,cpu够强劲的话,应该没有问题 。
    在公网上,包控制在1k,那样对cpu要求较高,并要实现一些可靠传输算法。这个就比较复杂了情况。
      

  2.   

    只要条件允许基本都能收到吧,但不能保证什么全收到,UDP嘛,感觉没有其他什么办法
      

  3.   

    我来理解楼主的意思
    发送方带宽800M
    接收方带宽1M,
    发送方通过UDP给接收方发生1G数据,接收方如何完全接收这个问题在于修正你的发送模式
    要把发送模式从主动发送改成被动发送。什么意思呢?
    1.发送方 通知接收方 “我有1G数据要发给你”
    2.接收方 将1G分成许多数据块,按序列向发送方请求对应块的数据
    3.发送方收到数据块请求,将对应数据块发送给对方。
    4.接收方在发送某块数据块请求以后,一定时间没有收到数据,则表示网络丢包或者超时,重新请求该块
    简而言之就是把push改成pull至于UDP的丢包问题,可以考虑使用可信赖UDP,例如UDT,Enet
      

  4.   

    不考虑接收方的实际带宽限制 [无所谓,尽力]
    [1]设置SOCKET 接收缓冲为尽可能的大,例如 512KB
    [2]可以直接使用阻塞RECV循环接收+分配足够大和多的缓冲
    [3]提高处理线程的优先级别目前能做的只有这么多了
      

  5.   

    不知道你是如何从楼主对问题的表述得出如此理解的,同时你的理解我也看不懂(不知道楼主能否看懂).按我的理解,楼主说的发送方的速率有800Mbps,并且是在1Gbps的网络当中,网络硬件设备应该是可以完成这个交互量的.关键点在于如何能够及时处理掉.先要清楚这800Mbps的量被分成了多少个UDP包,通常来讲,如果在50000个以内,应该是可以处理掉的.那么就要求接收方有独立的线程(最好是多个)专职接收,接收之后不做任何处理,直接投入到队列当中继续接收.然后由业务队列对队列当中的数据进行进一步处理.不过,要想达到完完全全地不丢一个报文,那几乎是不可能的,只是尽可能快的从缓冲区当中收取下来可以减少丢包.
      

  6.   

    当然,我说的是5000个包,是指的普通的PC,大约的配置,1.5G以上双核CPU,有足够可供使用的物理内存(在高占用期间可以看通过任务管理器看到的统计值为空闲50MB以上).
      

  7.   


    默认的udp,根本就很难保证对方成功能接收到的.UDP的缺点在于,就算发送方发送的API返回成功标志,也并不代表收接方对成功接收到,这就是现代网络游戏,基本99%都不会用UDP(UDP网络游戏比较多时是主流还是在用33.6带率猫上网的时代),就算现代的网络通信程序,象QQ,MSN,yahoo messaenger,aol messenger等,除了QQ是用可以用UDP或TCP外,其它的全是用TCP,这是因为TCP协议的稳定性远高于UDP.你上面所提的问题,在默认的UDP基本上,是基本没办法做到100%收到的,除非将默认的UDP封装后再修改下(QQ为了保证数据传输的稳定性,对UDP也是再封装过的,并不是使用默认的UDP协议,不过仍然存在丢包的情况,只是机率很低罢)
      

  8.   

    在公网上,包控制在1k,那样对cpu要求较高,并要实现一些可靠传输算法。这个就比较复杂了情况。
      

  9.   

    在公网上,包控制在1k,那样对cpu要求较高,并要实现一些可靠传输算法。这个就比较复杂了情况。
      

  10.   

    个人建议可以使用IOCP试一下,保持N X 3个(N 为CPU核心数)WSARecvFrom + N X 3个网络IO线程.
    WSARecvFrom返回之后,立即发起一个新的WSARecvFrom,然后再放到业务队列进行处理.
      

  11.   

    800m/s那是相当大的数据量了,对于1000m网卡,应该没多大问题,可是,在socket数据接收这层可能处理不过来,除非硬件强旱(多个cpu,内存大).
      

  12.   

    to lhtang:我如何知道目前的机子配置,可以发送的最大速率呢?(我的机子:DELL330 )时间紧,大虾们帮帮我呀!
      

  13.   

    我的机子配置:
    Intel(R) Pentium Dual CPU
    [email protected]
    1.99HZ, 0.98GB的内存
    物理地址扩展
      

  14.   

    OVERLAPPED ,两个线程,应该就没问题了
      

  15.   

    我发现,从网卡收到数据到Receive()接收完数据需要花很长的时间,所以看起来丢包严重。哪些因素会影响接收效率呢?