一个关于Socket缓冲区设置大小的问题
基于Socket的数据传输中,如果是在本机上运行,我发现只要大一些的文件就无法传输成功,开始怀疑是缓冲区太小了,导致接收端的数据不断被重写,后来我通过Setsocketopt来设置,1024*1024*1024*50(设置成很大,是为了测试),结果还是不行,传输40M的东西都不能成功,我发送文件的时候是1024个字节当作一个数据内容来发送的,于是我就在每次send之后就Sleep(1),又可以发送成功,就是速度奇慢无比,每次都sleep太慢了,所以我想发送几个数据包后再sleep,所以加上以下控制段:
if(SleepTime == 40 )
{
Sleep(1);
SleepTime = 0;
}
可是这样发送又不成功了。
我的发送和接受都是开线程解决的。
现在想请教各位牛人,遇到这个问题有什么解决方法吗?还有一个问题就是为什么发送40次后再Sleep为什么又会失败?难道是同步问题?我试过减少为发送了10次就sleep,结果更厉害,直接出错了,错误是****不能写,估计是内存出错了。
[解决办法]
不管发送多大的数据,一定要注意判断send的返回值,这才是真正发送出去的字节数
需要记住的是任何一个带有返回值的function,其返回值都有一定的意义,除非你很明确不关心,一定要养成处理返回值的习惯,
char *Buf;#define BUF_LEN 10*1024*1024//10MBBuf = new char[BUF_LEN];//此时Buf当中都是随机数据,实际需要的话,自己填充int iNeedSend = BUF_LEN;char *p = Buf;while(iNeedSend){ int iRet = send(sock,p,iNeedSend,0); if(iRet <= 0) return;//小于0表示出错,等于0表示断开 p += iRet; iNeedSend -= iRet;}delete[] Buf;