一次socket排错

用socket通信,一般复用以前的组件,很少直接从底层写,很多问题没有注意到。这次写人脸打卡,server和qo之间的通信,我用以前的Transporter,底层是TCP通信。每当qo重启或者通信错误时,server便重连一次。

程序刚开始运行很正常,但是有一次发现通信错误,qo发给server的内容是错误的,于是排查。刚开始以为是qo错误,但是看了一下qo的日志,发现没有问题。于是用ss -anp查看socket连接状态。不看不要紧,一看发现一个奇怪的现象,如图:




接收和发送端使用的端口居然一样!奇哉怪哉!

我们知道操作系统会为连接分配端口,同样的通信协议,理论上不应该分配同样的端口呀。利用我的tcp/ip知识,刚开始以为qo是绑定的127.0.0.1,这样也许会出现同样的端口,但是好像也不是。

想了很久得不到答案,于是到论坛向别人请假。得到的答案是,tcp连接中,一般server会主动绑定端口,所以端口是人为指定的。但是client的端口在连接建立时,会由操作系统指定,这个端口可以看做是一个随机的值(有人说是32768-60999,待确定)。当操作系统指定的值和人赋给server的值恰好一样时,就出现了上面的现象,导致双方可以发送,但是发送的内容是错误的。

避规的方法是将server的端口设小一点。

本来以为自己发现了一个内核的bug,还小兴奋,结果别人说很常见。

猜你喜欢

转载自onmyway-1985.iteye.com/blog/2377147