//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/IPsocket大数据recv函数
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/IPsocket大数据recv函数
解决方案 »
- 如何在组合框的data中添加选项
- 本地安全策略 账户策略的信息 注册表中的位置?????
- 管道操作的问题,为什么我用CreateProcess执行一个命令,dos窗口会出不来呢?
- 关于常规DLL显示非模式对话框的问题(急)
- 关于WSAEventSelect模型
- 《深入浅出MFC》书中的错误
- 我用IADORecordBinding来完成一个记录的增加,可记录没有加进出,为什么?
- 进程的一个问题
- 用wise install8安装打包bde,安装后,数据库里的汉字在应用程序中全是乱码?
- [100分][新手问题] 帮我看看这段代码哪里发生了内存泄漏,刚学不懂。
- 求大神指教C++中atlrx正则表达式的书写规范
- 关于视图序列化的问题
char aaa[5];
itoa(ret,aaa,10);你这个10
不对把!
int nRecved = 0;
while(len>0)
{
ret=recv(recvs,(char*)recv_d+nRecved,len - nRecved,0);
if (ret==SOCKET_ERROR)
{
return;
}
nRecved += ret; }
tcp不用怕掉数据,下层有个接收缓冲区,大小可以自己设, 这个没满没问题,如果满了, 就开始堆服务器的发送缓冲区,这个在满了,服务器就send返回错误, WSAGetLastError() 缓冲区已满。
每次少收点问题就解决了,不过,还是不怎么清楚;服务器那端,send的返回值168000,send把数据copy到发送缓冲区不就返回了,而接收发送缓冲区只有4k,那“多余”的那些数据呢?阻塞在哪里了么?还是我理解有问题
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+(sizeof(recv_d) - len),len,0);
你把每次接收到的实际数据大小累加等于你发送的数据大小时退出循环就可以了!
tcp基本不存在丢包的问题,除非你接收线程阻塞时间太久,但是tcp粘包问题需要考虑,
看你的例子估计你这不需要考虑粘包的问题