A B要连接到S,肯定首先A B双方都会在本地创建一个socket,
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。
我猜测,
udpClient.Send(内网地址); 连到的是一台服务器udpClient.Send(公网地址); 从 Internet 上绕了一圈,仍然连到了同一台服务器问题描述不够清楚,只是猜测,不承担任何责任,转帖过500与本人无关
并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则
NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。
udpClient.Send(内网地址);
就通了?真的就通了?
udpClient.Send(内网地址);
如果是拓管的服务器,从任何地方访问的都是相同的公网地址,不存在什么内网地址,只有可能存在内部局域网络(也就是速度会快点)。
如果是你们公司的网络,那就有公网地址和内网地址区分,那么从外面Send都是公网地址+端口,然后到路由器,由路由器设置访问的指定定端口是到哪台内网的IP。如果从内部局域网访问就直接用内网IP+端口