我们在调用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的数据包。这个包代表的