读书人

请问一个关于 winsockt TCP recv大数据

发布时间: 2013-06-26 14:29:32 作者: rapoo

请教一个关于 winsockt TCP recv大数据时的问题
//recv_d是一个168000字节的大数据
int len=sizeof(recv_d);
while(len>0)
{
ret=recv(recvs,(char*)recv_d+ret,len,0);
if (ret==SOCKET_ERROR)
{
closesocket(recvs);//关闭套接字句柄
cout<<"与服务器连接错误"<<endl;
return 0;
}
len=len-ret;
//查看一下每次实际recv的字节数
char aaa[5];
itoa(ret,aaa,10);
AfxMessageBox(aaa);

}

症结所在:程序运行时,有时候循环一次收到168000字节的数据,数据没有问题:有时循环两次,分别收到20000,148000的数据,也没问题;但是有时循环3次,4次或者更多,每次收到不等的数据(加起来总共168000),这时候的数据就有问题了,刚学网络编程,望前辈们不吝赐教,(*^__^*) 嘻嘻…… TCP/IP socket 大数据 recv函数
[解决办法]
recv_d+ret 这里错了。 求分啊
[解决办法]

char * buf = new char[65535];
memset(buf , 0 , 65535);

int mCopyLen = 0;
whie(1)
{
int retLen = recv(recvs , buf , 65535 , 0);
if(retLen > 0)
{

memcpy(recv_d +mCopyLen, buf , retLen);
mCopyLen += retLen;
}else if (retLen < 0)
{
break;
}



}
[解决办法]
ret=recv(recvs,(char*)recv_d+ret,len,0);改为
ret=recv(recvs,(char*)recv_d+(sizeof(recv_d) - len),len,0);
[解决办法]
楼上说的对!看来大家都跟楼主一样粗心啊
[解决办法]
简单点的办法是你把recv的接收数据的buffer开大点,超过你发送数据的大小,复杂点的办法是
你把每次接收到的实际数据大小累加等于你发送的数据大小时退出循环就可以了!
tcp基本不存在丢包的问题,除非你接收线程阻塞时间太久,但是tcp粘包问题需要考虑,
看你的例子估计你这不需要考虑粘包的问题

读书人网 >VC/MFC

热点推荐