TCP重连之后还是收到之前的数据

chllcy 2016-12-13 10:36:37
我这边客户端事阻塞模式,一个send,一个recv,当出现recv超时时,会close,然后重新建立TCP连接,但是压测发现有时候超时重连,下一次send之后recv数据还是之前发过来的数据,导致后续的数据都错乱了。
而且我在TCP重连后下一次send之前已经用select查看接收缓冲区有没有数据了,有就清除。
这个问题,比较偶现,不知道为什么TCP重连之后还能接收到上次的数据,有什么办法避免这种情况呢?
...全文
433 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ma100 2016-12-16
  • 打赏
  • 举报
回复
断开连接需要2步 close 和 shutdown 谁在前我忘了
yes-hyh 2016-12-16
  • 打赏
  • 举报
回复
应该是你代码有问题,TCP连接断开后,重新建立新的连接,不可能受到的是上次数据! 检查一下,是否没清理自己的缓冲区?recv返回的有本次接收的数据长度,请严格按照返回的长度来定位数据。若超出了,则有可能是你上次没清理掉的数据!
赵4老师 2016-12-13
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
xian_wwq 2016-12-13
  • 打赏
  • 举报
回复
引用 楼主 chllcy 的回复:
我这边客户端事阻塞模式,一个send,一个recv,当出现recv超时时,会close,然后重新建立TCP连接,但是压测发现有时候超时重连,下一次send之后recv数据还是之前发过来的数据,导致后续的数据都错乱了。 而且我在TCP重连后下一次send之前已经用select查看接收缓冲区有没有数据了,有就清除。 这个问题,比较偶现,不知道为什么TCP重连之后还能接收到上次的数据,有什么办法避免这种情况呢?
数据不会错乱的,tcp是基于流的,只有可能是解包逻辑有问题。 常用的方法是将数据放入缓存,找到自己的合法报头, 根据报头中的长度, 将数据依次解出来。 至于其他数据,因为不符合要求,抛弃掉就可以了。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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