tcp调用recv接口未判断接收缓冲区长度导致返回值为零误判为链路断开

    我们在调用recv(fd,buf,len,0)接口时,都要判断返回值,如果返回值为0,表示链路已断开。然而如果len设置为0,那么返回值也是0,此时如果判断链路断开,显然是不对的.在最近一次测试新功能的时候,测出了这样一个旧bug。追查bug的过程如下:

    为了测试一个新功能,有这样一个场景:A向B疯狂的发送异步消息,其中B调用了我的接口。现象:B没过多久发现recv()的返回值为0,判断链路断开,然后尝试重连A。这种高频发送异步消息的场景我之前也是测试过的,是没有问题的,只是没有到达“疯狂”的程度。这也导致我错误的认为自己的代码没有问题,能够撑住高频异步消息的场景,实际证明,我当时测试的“高频”,还不够高频,所以没有测出问题。

    解决过程:发现B断开链接之后,A和B的代码逻辑中,都认为是对方主动断开,于是进行万能的抓包。所幸A和B不在同一台机器上面,否则还真抓不到,如果他们的通信没有经过网卡的话。抓包发现:B给A发了一个RST的数据包。这个包代表的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值