请问:MFC TCP/IP使用Receive接收数据,网络不好的情况下,发送方和接收方的数据不一致,何故呢?

程序员小哈
嵌入式领域优质创作者
博客专家认证
2013-10-25 11:26:58
请问:MFC TCP/IP使用Receive接收数据,网络不好的情况下,发送方和接收方的数据不一致,何故呢?recSo.Receive(buff,6250)

得到的数据,发现,接收方和发送方的数据不一致,我发送的是6250个字节,接收方接收到的长度也是6250,但是,发现有一部分数据是重复的,比如头200个字节实际上跟后200个字节是一样的了,也就是说丢了一部分数据,请问,为什么会出现这种情况呢?是我网络不佳,(wifi的信号很低,局域网内传输)导致TCP IP重发导致的数据重复吗?

还是我一次不应该接收那么大的数据呀,6250好像也不大呀?
...全文
267 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShengFei01 2013-10-25
  • 打赏
  • 举报
回复
tcp 数据不会丢失,你可以看这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
发现楼主ID跟我前面很像。。。先mark一个 TCP的话应该不会有这种情况,没用过封装的Receive函数,不知道里面是怎样的
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 16 楼 rsdtt 的回复:
[quote=引用 15 楼 rsd102 的回复:] [quote=引用 14 楼 rsdtt 的回复:] [quote=引用 13 楼 rsd102 的回复:] [quote=引用 12 楼 rsdtt 的回复:] 既然你是写入txt就没必要用CString了吧 另外你不buff那么大,Receive中才用6250?不清楚Receive里面是怎样做的 msg+=buff;这里应该是遇0就会停止,所以数据就会漏掉
没,发送的数据还是整形数据的,我是发送完之后,存了一份txt,一是为了备份,另外为了对比一下接收的是否正确,后来发现不正确[/quote] 整形数据,有int的结构体?在recv的过程中按字节接收,buff中肯定会有存在0的情况[/quote] 有道理,不过中断了,为什么还会重复呢[/quote] 那就需要你逐行调试看看其中的结果了[/quote] 恩,我再调试调试试试吧,谢谢你的回复哈
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
引用 15 楼 rsd102 的回复:
[quote=引用 14 楼 rsdtt 的回复:] [quote=引用 13 楼 rsd102 的回复:] [quote=引用 12 楼 rsdtt 的回复:] 既然你是写入txt就没必要用CString了吧 另外你不buff那么大,Receive中才用6250?不清楚Receive里面是怎样做的 msg+=buff;这里应该是遇0就会停止,所以数据就会漏掉
没,发送的数据还是整形数据的,我是发送完之后,存了一份txt,一是为了备份,另外为了对比一下接收的是否正确,后来发现不正确[/quote] 整形数据,有int的结构体?在recv的过程中按字节接收,buff中肯定会有存在0的情况[/quote] 有道理,不过中断了,为什么还会重复呢[/quote] 那就需要你逐行调试看看其中的结果了
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 14 楼 rsdtt 的回复:
[quote=引用 13 楼 rsd102 的回复:] [quote=引用 12 楼 rsdtt 的回复:] 既然你是写入txt就没必要用CString了吧 另外你不buff那么大,Receive中才用6250?不清楚Receive里面是怎样做的 msg+=buff;这里应该是遇0就会停止,所以数据就会漏掉
没,发送的数据还是整形数据的,我是发送完之后,存了一份txt,一是为了备份,另外为了对比一下接收的是否正确,后来发现不正确[/quote] 整形数据,有int的结构体?在recv的过程中按字节接收,buff中肯定会有存在0的情况[/quote] 有道理,不过中断了,为什么还会重复呢
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
引用 13 楼 rsd102 的回复:
[quote=引用 12 楼 rsdtt 的回复:] 既然你是写入txt就没必要用CString了吧 另外你不buff那么大,Receive中才用6250?不清楚Receive里面是怎样做的 msg+=buff;这里应该是遇0就会停止,所以数据就会漏掉
没,发送的数据还是整形数据的,我是发送完之后,存了一份txt,一是为了备份,另外为了对比一下接收的是否正确,后来发现不正确[/quote] 整形数据,有int的结构体?在recv的过程中按字节接收,buff中肯定会有存在0的情况
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 12 楼 rsdtt 的回复:
既然你是写入txt就没必要用CString了吧 另外你不buff那么大,Receive中才用6250?不清楚Receive里面是怎样做的 msg+=buff;这里应该是遇0就会停止,所以数据就会漏掉
没,发送的数据还是整形数据的,我是发送完之后,存了一份txt,一是为了备份,另外为了对比一下接收的是否正确,后来发现不正确
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
既然你是写入txt就没必要用CString了吧 另外你不buff那么大,Receive中才用6250?不清楚Receive里面是怎样做的 msg+=buff;这里应该是遇0就会停止,所以数据就会漏掉
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
引用 9 楼 rsd102 的回复:
[quote=引用 6 楼 rsdtt 的回复:] [quote=引用 3 楼 rsd102 的回复:] [quote=引用 2 楼 ShengFei01 的回复:] tcp 数据不会丢失,你可以看这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
网络好的话,我这么用没问题,这种情况也只是遇到过一次,当时两个屋子隔了两道墙,信号是拿两个无线路由中继连接的,我发送一次数据6250个字节,计时要10S左右才能收到,不知道是不是网络不好,一直重发的原因导致时间过长吗?就在一个局域网中,按理来说不能这么慢的呀[/quote] 你多次尝试都是同样的内容还是有不一样的内容??[/quote] char buff[65535]={0}; CString msg = ""; int ret=0; for(;;) { ret=recSo.Receive(buff,6250); if(ret==0) break; msg+=buff; } 我获取数据部分这么写的,貌似不太对吧[/quote] 不知道这样写会不会遇0后msg就停止了
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 8 楼 worldy 的回复:
[quote=引用 楼主 rsd102 的回复:] 请问:MFC TCP/IP使用Receive接收数据,网络不好的情况下,发送方和接收方的数据不一致,何故呢?recSo.Receive(buff,6250) 得到的数据,发现,接收方和发送方的数据不一致,我发送的是6250个字节,接收方接收到的长度也是6250,但是,发现有一部分数据是重复的,比如头200个字节实际上跟后200个字节是一样的了,也就是说丢了一部分数据,请问,为什么会出现这种情况呢?是我网络不佳,(wifi的信号很低,局域网内传输)导致TCP IP重发导致的数据重复吗? 还是我一次不应该接收那么大的数据呀,6250好像也不大呀?
应该不会有这样的事情发生,TCP就是用于在不可靠的网络上实现可靠的通信,如果包不正确,则包会丢弃,并请求重传;应该不会出现数据混乱! 估计是不是LZ检查数据的时候,看走眼了,呵呵[/quote] 我也怀疑我的程序哪里写错了 char buff[65535]={0}; CString msg = ""; int ret=0; for(;;) { ret=recSo.Receive(buff,6250); if(ret==0) break; msg+=buff; } 我获取数据部分这么写的,貌似不太对吧 我一次就接收6250个数据的
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 6 楼 rsdtt 的回复:
[quote=引用 3 楼 rsd102 的回复:] [quote=引用 2 楼 ShengFei01 的回复:] tcp 数据不会丢失,你可以看这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
网络好的话,我这么用没问题,这种情况也只是遇到过一次,当时两个屋子隔了两道墙,信号是拿两个无线路由中继连接的,我发送一次数据6250个字节,计时要10S左右才能收到,不知道是不是网络不好,一直重发的原因导致时间过长吗?就在一个局域网中,按理来说不能这么慢的呀[/quote] 你多次尝试都是同样的内容还是有不一样的内容??[/quote] char buff[65535]={0}; CString msg = ""; int ret=0; for(;;) { ret=recSo.Receive(buff,6250); if(ret==0) break; msg+=buff; } 我获取数据部分这么写的,貌似不太对吧
worldy 2013-10-25
  • 打赏
  • 举报
回复
引用 楼主 rsd102 的回复:
请问:MFC TCP/IP使用Receive接收数据,网络不好的情况下,发送方和接收方的数据不一致,何故呢?recSo.Receive(buff,6250) 得到的数据,发现,接收方和发送方的数据不一致,我发送的是6250个字节,接收方接收到的长度也是6250,但是,发现有一部分数据是重复的,比如头200个字节实际上跟后200个字节是一样的了,也就是说丢了一部分数据,请问,为什么会出现这种情况呢?是我网络不佳,(wifi的信号很低,局域网内传输)导致TCP IP重发导致的数据重复吗? 还是我一次不应该接收那么大的数据呀,6250好像也不大呀?
应该不会有这样的事情发生,TCP就是用于在不可靠的网络上实现可靠的通信,如果包不正确,则包会丢弃,并请求重传;应该不会出现数据混乱! 估计是不是LZ检查数据的时候,看走眼了,呵呵
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 6 楼 rsdtt 的回复:
[quote=引用 3 楼 rsd102 的回复:] [quote=引用 2 楼 ShengFei01 的回复:] tcp 数据不会丢失,你可以看这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
网络好的话,我这么用没问题,这种情况也只是遇到过一次,当时两个屋子隔了两道墙,信号是拿两个无线路由中继连接的,我发送一次数据6250个字节,计时要10S左右才能收到,不知道是不是网络不好,一直重发的原因导致时间过长吗?就在一个局域网中,按理来说不能这么慢的呀[/quote] 你多次尝试都是同样的内容还是有不一样的内容??[/quote] 内容不一样的,因为我传的是我们的测得的数据,远端数据被保存的,当时就感觉有点不对,后来对比两端的txt才发现,有一部分接收错了,我估计还是程序哪里编写不正确
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
引用 3 楼 rsd102 的回复:
[quote=引用 2 楼 ShengFei01 的回复:] tcp 数据不会丢失,你可以看这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
网络好的话,我这么用没问题,这种情况也只是遇到过一次,当时两个屋子隔了两道墙,信号是拿两个无线路由中继连接的,我发送一次数据6250个字节,计时要10S左右才能收到,不知道是不是网络不好,一直重发的原因导致时间过长吗?就在一个局域网中,按理来说不能这么慢的呀[/quote] 你多次尝试都是同样的内容还是有不一样的内容??
rsdtt 2013-10-25
  • 打赏
  • 举报
回复
引用 4 楼 rsd102 的回复:
[quote=引用 1 楼 rsdtt 的回复:] 发现楼主ID跟我前面很像。。。先mark一个 TCP的话应该不会有这种情况,没用过封装的Receive函数,不知道里面是怎样的
是好巧哈,RSD是我们实验室英文名称的缩写^_^[/quote] rsd是我第一次接触电脑时乱打用的游戏名字
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 1 楼 rsdtt 的回复:
发现楼主ID跟我前面很像。。。先mark一个 TCP的话应该不会有这种情况,没用过封装的Receive函数,不知道里面是怎样的
是好巧哈,RSD是我们实验室英文名称的缩写^_^
程序员小哈 2013-10-25
  • 打赏
  • 举报
回复
引用 2 楼 ShengFei01 的回复:
tcp 数据不会丢失,你可以看这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
网络好的话,我这么用没问题,这种情况也只是遇到过一次,当时两个屋子隔了两道墙,信号是拿两个无线路由中继连接的,我发送一次数据6250个字节,计时要10S左右才能收到,不知道是不是网络不好,一直重发的原因导致时间过长吗?就在一个局域网中,按理来说不能这么慢的呀

18,356

社区成员

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

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