我写的程序在大流量的数据时候,会大量的掉包,是为什么呢?有哪些情况会导致这个后果呢?

解决方案 »

  1.   

    1。网络状况很差,可能严重丢包
    2。使用UDP传输数据,在公网上可能会大量丢包
    3。如果能排除上述原因,那么丢包最大的可能就是程序有问题。
      

  2.   

    晕!是我程序问题!!!是TCP的,不是UDP!小数据不会丢,数据一大就丢了....开始我以为是BUF不够大.设大了还是一样的丢..
      

  3.   

    恩,没错,我用tcp发送大流量的时候也发现这样的情况。
    估计是你的程序除了问题。我怀疑你是一个包一个包的连续发送。好像是不能这样发送的,要等到缓冲区发送完再发送下一个包,不然就会丢掉这个包,其实这个包还没有发送到网络上。你找找以前的帖子,我记得有说过这个问题的。
      

  4.   

    应该等待FD_WRITE(异步的情况下)的消息,才可以发送数据。只有这个消息到来时才说明可以发送数据(实际上不是发送数据,而是可以往底层的buff里面写数据,等待底层把你的数据发送出去)。基本上还是程序的问题。
      

  5.   

    使用异步,不需要你自己控制发送数据时间间隔。
    等待FD_WRITE(异步的情况下)的消息,发送数据,并根据send返回的值,来判断发送数据是否成功,如果不成功,则等待下一FD_WRITE的消息,再发送剩下来的数据(如果连接还是正常的话)。
      

  6.   

    关了也没有用,我把BUF调大了也没有用!
    我用的CAsyncSocket.
    比如服务器发来3000字节,我只会转发2000多字节给客户端.
      

  7.   

    在tcp中,程序调用send时,只不过将数据放入发送缓存,有可能调用send发送500个字节的数据,而发送缓存只有300个字节的空余,那么其余200个字节会被本机丢掉,根本不会传输到网络,每次调用完send看看返回值是否与要发送的数据量相同,如小于要发送的数据量则表明发送缓存不够了,可将余下的数据等一会儿再发
    char buf[500]={"aaaa....."};
    long AllSendNum=0;
    long SendNum=send(sock,buf,500,NULL);
    while(AllSendNum+SendNum<500)
    {
       AllSendNum+=SendNum;
       SendNum=send(sock,buf+AllSendNum,500-AllSendNum,NULL);
    }
      

  8.   

    使用CAsyncSocket.Send()发送是立即返回(非阻塞)的,通常都不会发完
    最好用CAsyncSocket.OnSend(0)