TCP socket发送大数据时,接收端和发送端数据不一致,怎么回事儿?

zjk2752 2013-12-20 06:02:55
问题描述说如上面,我有一个100M的文件,每次从文件中读取32K发送到对端,但是概率性的出现,发送端发送完之后,接收端接收到的数据量小于100M。差的量还不固定,有可能剩下10K或者20K或者几百个字节没有接收。并且发送过程中socket也没报任何异常。
希望高人指点,网上有说是发送缓冲区满了。什么的,但是TCP应该不会丢吧?


在线等啊
...全文
1681 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangxingmeng 2015-06-10
  • 打赏
  • 举报
回复
如果是不再同一个主机上,一定要保持接受一个定长数据,如需要接受size个字节代码为 int get_size_buf(int cfd,char * buf,size_t size) { int i = size; int ret = 0; while(i > 0 && (ret = read(cfd,buf + (size - i),i)) > 0) { i -= ret; } //read() == 0 可能cfd关闭 return (i == 0)?size:0; } 保证每次一定读满缓冲区。
lixin_4055 2015-05-29
  • 打赏
  • 举报
回复
这是挖坟么...
Carl_CCC 2015-05-16
  • 打赏
  • 举报
回复
你这应该是服务端没收完数据,你可以把服务端每次收到的数据长度,累加起来。
zhangjikangzjk 2015-05-16
  • 打赏
  • 举报
回复
你要叫zjk?
zjk2752 2013-12-23
  • 打赏
  • 举报
回复
引用 5 楼 czc1009 的回复:
1、每次发送完成之后sleep,不要太小; 2、将发送大小改下,设置为512k或者其他; 3、(1+2) 如果还是出现此问题,逐步调试吧~~~
发送完sleep已经试过了。甚至发送完之后不关闭socket还有。另外,32K这个是几个组讨论的结果,还涉及到其它东西,也不好改。总之,谢谢啦,我再调调吧。
zjk2752 2013-12-23
  • 打赏
  • 举报
回复
自己解决了。抓包发现,我这边发送端确实没有问题的,100M数据全部成功的发送了出去。但是在客户端抓包发现,客户端在接收末尾段会收到一个RST包,意思就是客户端没有收完数据,提前把socket关闭了,异常退出。
czc1009 2013-12-21
  • 打赏
  • 举报
回复
1、每次发送完成之后sleep,不要太小; 2、将发送大小改下,设置为512k或者其他; 3、(1+2) 如果还是出现此问题,逐步调试吧~~~
KeequenLiu 2013-12-20
  • 打赏
  • 举报
回复
先确定你发送成功返回值 全部加起来是否为100M的大小 ,如果是说明发送没有问题。 如果发送没有问题,你先不要用你自己的接收程序来接收,网上找个Socket调试工具,来接收你发送的数据。 如果接收的大小为100M,则说明网络环境没有问题,你的接收程序有问题,最后检查接收程序。要不就把拿部分代码出来,让别人看看
空的 2013-12-20
  • 打赏
  • 举报
回复
no 代码~~
zjk2752 2013-12-20
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
发送端,定长发送,确认每次都发送定长数据成功! 接收端,定长接收,确认每次都收到定长数据成功
发送端每次send我会记录send的返回值 ,这个是没问题的。接收端每次接收时也记录接收总值,这个接收总值就要比我的发送值少一些字节。并且这种情况不是必现。好纠结。
max_min_ 2013-12-20
  • 打赏
  • 举报
回复
发送端,定长发送,确认每次都发送定长数据成功! 接收端,定长接收,确认每次都收到定长数据成功

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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