关于Socket 设置 IPAddress.Any 情况下,出现服务器积极拒绝的问题

简介: 前几天在做p2p TCP穿透的时候,发现了一个很严重的一个问题,由于需要做点对点穿透,无法预知外网IP和内网IP哪个会被连接,所以 P点 机器上使用了 socket.bind(IPAddress.Any, port); 并且使用端口复用,socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); //设置端口可重用 。

前几天在做p2p TCP穿透的时候,发现了一个很严重的一个问题,由于需要做点对点穿透,无法预知外网IP和内网IP哪个会被连接,所以 P点 机器上使用了 socket.bind(IPAddress.Any, port); 并且使用端口复用,socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); //设置端口可重用 。以下称A机器,B机器,S服务器。A向B做穿透连接。

在B的同一个端口上,启动了连接S服务器的socket 和一个监听另一个P机器连接的socket ,但是问题出现了,在服务器S帮忙穿透后,A向B连接时,出现了无法连接,服务器积极拒绝的情况。后来在局域网中测试,发现把B的 bind 的 IPAddress.Any, 改成 固定的内网IP后,没有出现那种情况。

刚开始很郁闷,不是IPAddress.Any 可以在任何IP接口上启动监听吗,怎么不行?

一想,可能是B的端口复用上出现了问题,因为在同一个端口上绑定了另外一个Socket , 当然,端口复用不是问题所在,而是在端口复用的另一个Socket 上 (与 S 做连接的Socket ) 绑定的是固定的内网IP,而不是IPAddress.Any 。 具体也不知道原理,我猜想可能是绑定固定IP的SOCKET 比较优先吧,所以导致另一个复用的端口不能正常在IPAddress.Any 监听。后来,把那个绑定固定IP的SOCKET 也改成IPAddress.Any 就没有出现问题了。

情况复杂,说得比较乱,完全是自己备忘和给有心人提个醒。

为这个问题郁闷了半天,下班回家晚上快睡觉的时候,慢慢整理出一个头绪,想到可能可以解决的办法。

 

后来查了资料,才明白了原理:端口复用时,当连接到来时,按最明确及最近绑定的原则将连接交给某一个应用处理

目录
打赏
0
0
0
0
13
分享
相关文章
端口复用(bind error: Address already in use 问题)
端口复用(bind error: Address already in use 问题)
681 0
DNS:无类IN-ADDR.ARPA委托
分配更长的前缀(更少的地址空间)时遇到的问题之一是,这样的组织似乎不可能自主维护自己的反向(“IN-ADDR.ARPA”)区域。通过使用下面描述的反向授权方法,可以消除对将较长前缀分配给不相关组织的最重要的反对意见。
330 0
如何关闭 DEBUG org.apache.http.**日志
如何关闭 DEBUG org.apache.http.**日志
548 0
如何关闭 DEBUG org.apache.http.**日志
解决办法:Cannot find the class file for org.apache.http.client.ClientProtocolException
解决办法:Cannot find the class file for org.apache.http.client.ClientProtocolException
412 0
The type org.apache.http.NameValuePair cannot be resolved. It is indirectly referenced from requi...
eclipse莫名其妙的bug 解决方案如下,把编译的android版本调低就可以了 调低编译版本
1654 0