一次socket排错

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

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


[img]http://dl2.iteye.com/upload/attachment/0125/2045/4ba53117-40e6-31ad-a469-6723175d6bbf.jpg[/img]

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

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

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

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

本来以为自己发现了一个内核的bug,还小兴奋,结果别人说很常见。 :x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值