请教一个关于 winsockt TCP recv大数据时的问题

无他 2013-04-23 02:49:48
//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),这时候的数据就有问题了,刚学网络编程,望前辈们不吝赐教,(*^__^*) 嘻嘻……
...全文
234 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
无他 2013-04-28
  • 打赏
  • 举报
回复
每人都给点吧
无他 2013-04-28
  • 打赏
  • 举报
回复
怎么给分啊
无他 2013-04-28
  • 打赏
  • 举报
回复

一语惊醒梦中人啊,乍一看还没明白,仔细一想,豁然开朗啊
分不多,就给你们两位了,也谢谢其他其他热心网友啦
以后还望多多指教
csgo 2013-04-28
  • 打赏
  • 举报
回复
简单点的办法是你把recv的接收数据的buffer开大点,超过你发送数据的大小,复杂点的办法是 你把每次接收到的实际数据大小累加等于你发送的数据大小时退出循环就可以了! tcp基本不存在丢包的问题,除非你接收线程阻塞时间太久,但是tcp粘包问题需要考虑, 看你的例子估计你这不需要考虑粘包的问题
一桶姜山 2013-04-28
  • 打赏
  • 举报
回复
楼上说的对!看来大家都跟楼主一样粗心啊
youngwolf 2013-04-28
  • 打赏
  • 举报
回复
ret=recv(recvs,(char*)recv_d+ret,len,0);改为 ret=recv(recvs,(char*)recv_d+(sizeof(recv_d) - len),len,0);
一桶姜山 2013-04-27
  • 打赏
  • 举报
回复
貌似代码看不出明显的问题,既然加起来总数是对的那么楼主说的“出问题”是出了什么问题呢?
无他 2013-04-27
  • 打赏
  • 举报
回复
“出问题”我指的是接收到的数据有问题,中间一部分夹杂着乱码。按代码来recv是去接收缓冲区copy了总共168000字节的数据,但是其中一部分并不是我要的数据。
just_soso888 2013-04-27
  • 打赏
  • 举报
回复
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; } }
无他 2013-04-26
  • 打赏
  • 举报
回复
前辈们还有没有什么高见啊?
无他 2013-04-26
  • 打赏
  • 举报
回复
“recv_d+ret 这里错了。 求分啊 ” ret前面给0了,没复制过来,加个AfxMessageBox框,只是为了看看返回值,直观点,不是问题所在,存在数组里也是一样。send貌似不会出问题,recv数据一大,就得多copy几次了,我看了下出问题时的数据,每次出问题的地方都不一样,感觉是数据太大,recv从接收缓冲区copy数据就会出问题,而不是我程序哪里出错了
无他 2013-04-26
  • 打赏
  • 举报
回复

每次少收点问题就解决了,不过,还是不怎么清楚;服务器那端,send的返回值168000,send把数据copy到发送缓冲区不就返回了,而接收发送缓冲区只有4k,那“多余”的那些数据呢?阻塞在哪里了么?还是我理解有问题
  • 打赏
  • 举报
回复
引用 5 楼 wumn29 的回复:
收的次数多了 AfxMessageBox弹框没及时关闭导致后续包到达之后未及时接受而丢弃
tcp不用怕掉数据,下层有个接收缓冲区,大小可以自己设, 这个没满没问题,如果满了, 就开始堆服务器的发送缓冲区,这个在满了,服务器就send返回错误, WSAGetLastError() 缓冲区已满。
  • 打赏
  • 举报
回复
int len=sizeof(recv_d); int nRecved = 0; while(len>0) { ret=recv(recvs,(char*)recv_d+nRecved,len - nRecved,0); if (ret==SOCKET_ERROR) { return; } nRecved += ret; }
  • 打赏
  • 举报
回复
recv_d+ret 这里错了。 求分啊
wumn29 2013-04-25
  • 打赏
  • 举报
回复
收的次数多了 AfxMessageBox弹框没及时关闭导致后续包到达之后未及时接受而丢弃
菜牛 2013-04-24
  • 打赏
  • 举报
回复
关键的问题是你在里面显示对话框阻塞了这个接收过程,可能导致数据丢失。网络操作本来就是时间要求很高的,你还人为去阻塞。
无他 2013-04-23
  • 打赏
  • 举报
回复

前辈们,支援一下小弟啊
无他 2013-04-23
  • 打赏
  • 举报
回复
10进制啊?那你说是几啊?再说这不是问题的关键诶
jimette 2013-04-23
  • 打赏
  • 举报
回复
//查看一下每次实际recv的字节数 char aaa[5]; itoa(ret,aaa,10); 你这个10 不对把!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧