recv返回正确长度,但得到的数据是错误的?

zz962 2011-12-09 09:28:29
写了一个TCP程序负责转发数据,数据源会在短时间内来很多包,大小不一。
用recv接受下来之后send给另外一个socket。

发现如果来得包很多,会出现recv返回正确但得到的buf里内容不正确的现象。比如数据源是先把长度发过来,再把具体数据发过来。当包来得非常密集的时候,我就发现recv得到的长度有的很大,有的则是个负值,有的是0.

而且我发现如果在转发过程中加个Sleep100毫秒后,这种问题出现的几率会大大降低。

想了解为什么会有此问题,另外可能有什么办法(毕竟加延时不是长久之计)
...全文
308 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zz962 2012-01-08
  • 打赏
  • 举报
回复
谢谢各位,可惜没有一个满意的答案,很多连我的表述都没看懂
chelp 2011-12-27
  • 打赏
  • 举报
回复
这个问题我也见过,正常,解决方案ZZ962可用
zz962 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hushoubo 的回复:]

粘包处理
[/Quote]

现在这个设计就是长度和数据分别发送,我看很多解决粘包的设计也是这样的
zz962 2011-12-16
  • 打赏
  • 举报
回复
这个问题最终是通过在一轮recv和send之后加个sleep暂时解决
非常希望了解为什么会这样以及怎样解决最好
zz962 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sinservice 的回复:]

lz你现在还没有理解tcp的模型。
[/Quote]

请指点
Eleven 2011-12-11
  • 打赏
  • 举报
回复
数据接收以后,先解析长度,得到后续将要接收数据的字节大小,然后接收该大小即可。
zz962 2011-12-11
  • 打赏
  • 举报
回复
长度变量我是用一个临时变量
而数据是我new出来的

你指的清空缓冲区是清空哪个缓冲区,如何清空?
maoxing63570 2011-12-11
  • 打赏
  • 举报
回复
换句话说,就是你每次接收后,转发后,你应该把缓冲清空,然后再接收
maoxing63570 2011-12-11
  • 打赏
  • 举报
回复
每次接收后,缓冲是否都清空然后再接收?
zz962 2011-12-11
  • 打赏
  • 举报
回复
自己顶一下。
hushoubo 2011-12-11
  • 打赏
  • 举报
回复
粘包处理
用户 昵称 2011-12-11
  • 打赏
  • 举报
回复
不应该的。
「已注销」 2011-12-11
  • 打赏
  • 举报
回复
lz你现在还没有理解tcp的模型。
永远的明日 2011-12-11
  • 打赏
  • 举报
回复
应该不会有这样的问题吧?
你对照一下,发送端发送的长度及数据 ,接收端 接收的长度及数据 是否一致?!

18,356

社区成员

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

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