关于udp的P2P数据包穿透NAT的打洞方法,为何我不能成功?
我是把两个客户端运行在同一台主机,通过adsl拨号路由器上网,服务器端运行于公网上的一台服务器上.
Client A连接服务器的地址是:218.25.43.71:4300
Client B连接服务器的地址是:218.25.43.71:4301
当我从Client A发送到Client B(218.25.43.71:4301)时,Client B可以收到第一个数据包,但第二个就收不到了
同理,从Client B发送到Client A(218.25.43.71:4300)时,Client A可以收到第一个数据包,但第二个就收不到了
于是我采用网上查到的打洞方法,首先A-> B,然后A通知服务器告诉B-> A,这时A和B都可以收到对方的第一个数据包,收到第一个数据包时,我让客户端更新数据中的对方的端口,比如B收到A的数据包,A端口是4302;A收到B的数据包,B端口是4303,然后,当A向B(4303)发送数据包时,B无法收到,B向A(4302)发送时,A也无法收到.也就是说打洞方式并不成功.
[解决办法]
你碰上了自环的问题,你的NAT不支持自环(loop back).
解决方法是,你的服务器需要判断两个客户端是不是来自同一个IP,如果是同一个IP,直接让两个客户端进行局域网内的通信。
当然如果你的NAT支持自环,那么可以不去考虑这个问题了。
[解决办法]
换个路由器试试,或许你的这个路由器在端口映射中判断比较严格
nat打洞并不能处理所有的路由器的
[解决办法]
客户端当然能知道自己的内网IP和端口,这个你都没办法获得,那就先停下来,别打洞了
-----------
使用gethostname和gethostbyname这两个函数可以获得