我写的程序在大流量的数据时候,会大量的掉包,是为什么呢? 我写的程序在大流量的数据时候,会大量的掉包,是为什么呢?有哪些情况会导致这个后果呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1。网络状况很差,可能严重丢包2。使用UDP传输数据,在公网上可能会大量丢包3。如果能排除上述原因,那么丢包最大的可能就是程序有问题。 晕!是我程序问题!!!是TCP的,不是UDP!小数据不会丢,数据一大就丢了....开始我以为是BUF不够大.设大了还是一样的丢.. 恩,没错,我用tcp发送大流量的时候也发现这样的情况。估计是你的程序除了问题。我怀疑你是一个包一个包的连续发送。好像是不能这样发送的,要等到缓冲区发送完再发送下一个包,不然就会丢掉这个包,其实这个包还没有发送到网络上。你找找以前的帖子,我记得有说过这个问题的。 应该等待FD_WRITE(异步的情况下)的消息,才可以发送数据。只有这个消息到来时才说明可以发送数据(实际上不是发送数据,而是可以往底层的buff里面写数据,等待底层把你的数据发送出去)。基本上还是程序的问题。 使用异步,不需要你自己控制发送数据时间间隔。等待FD_WRITE(异步的情况下)的消息,发送数据,并根据send返回的值,来判断发送数据是否成功,如果不成功,则等待下一FD_WRITE的消息,再发送剩下来的数据(如果连接还是正常的话)。 关了也没有用,我把BUF调大了也没有用!我用的CAsyncSocket.比如服务器发来3000字节,我只会转发2000多字节给客户端. 在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);} 使用CAsyncSocket.Send()发送是立即返回(非阻塞)的,通常都不会发完最好用CAsyncSocket.OnSend(0) this指针传递,及GetDocument()的指针类型 inline是不是不能定义多个? 有没有人有兴趣改写我编的背单词啊? CClientDC dc(this)的问题 当CTreeCtrl的ITEM拖动超出控件范围时,如何让滚动条也相应改动 求救! 怎么使用DAO数据库中的图象(再线等待) 我是刚刚学VC的,请问各位大侠下面的语句有什么错误?? 请问有没有MP3分割剪切软件的源码 请教:如何传送文件 有没有办法用MFC写一个java httpservlet的客户端 给它传文件 GetDiskFreeSpace()谁用过它,谁有例程,获得剩余空间.
2。使用UDP传输数据,在公网上可能会大量丢包
3。如果能排除上述原因,那么丢包最大的可能就是程序有问题。
估计是你的程序除了问题。我怀疑你是一个包一个包的连续发送。好像是不能这样发送的,要等到缓冲区发送完再发送下一个包,不然就会丢掉这个包,其实这个包还没有发送到网络上。你找找以前的帖子,我记得有说过这个问题的。
等待FD_WRITE(异步的情况下)的消息,发送数据,并根据send返回的值,来判断发送数据是否成功,如果不成功,则等待下一FD_WRITE的消息,再发送剩下来的数据(如果连接还是正常的话)。
我用的CAsyncSocket.
比如服务器发来3000字节,我只会转发2000多字节给客户端.
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);
}
最好用CAsyncSocket.OnSend(0)