当前位置: 代码迷 >> Java相关 >> udp穿梭NAT
  详细解决方案

udp穿梭NAT

热度:68   发布时间:2016-04-22 21:00:27.0
udp穿越NAT
用java写了一个udp的服务器客户端程序,服务器程序server放在一台有公网ip的电脑上,监听6000端口。客户端client程序放在自己的电脑上,自己的电脑是通过一个路由器连接到外网的。  client向server的的6000端口发送数据,server能够收到,但是server返回的数据client收不到!

我用抓包工具wireshark发现自己的电脑收到了服务器返回的数据,但是端口不是客户端程序发送数据时的端口,而是经过路由器转换之后的端口! 也就是说,udp数据包从路由器出去之后经过端口映射,服务器回来的数据从这个映射过的端口到达不了客户端电脑! 请问各位大神,这是什么原因?

PS:网上说的udp打洞都是在公网服务器和内网电脑可以通过udp数据包通信的前提下的,我遇到的问题就是两者不能通过udp通信!

------解决方案--------------------
我最近也在做这个,不过我是用C,问题已经解决了,什么NAT,都是浮云,现在想想是自己把问题想复杂了,楼主可以将相关代码贴出来看一下,不过内网收不到外网的数据大多数都是socket地址结构或者发送接收的问题
------解决方案--------------------
你是客户端收不到服务器端的包还是服务器收不到客户端的包么?

去掉NAT,去掉防火墙就完全正常了?
------解决方案--------------------
问题应该在服务器那边,服务器那边的地址结构必须设置为客户端连接的那个IP 不能默认为“00.00.00.00” 或者为ADDR_ANY,不知道你是不是这个问题
------解决方案--------------------
引用:
Quote: 引用:


什么又路由器的问题呀。。。就是服务器代码的问题,我确定,楼主不能天马行空


其实,我现在也是这么觉得。

楼主请看:http://bbs.chinaunix.net/thread-4137828-1-1.html能不能解决你的问题
------解决方案--------------------
这样做肯定是发不回来的。

因为你服务器发回数据的源端口不对,并不符合我5楼说的。

你165行-185行回包的代码,是重新创了一个socket去回UDP包,那这样的话,回包会重新选择一个源端口,这样对于做NAT的防火墙来说,这是一个新的session,转不回来的。而对于做了DMZ的防火墙,是只做目的端口的,所以能通。

就你要达到的目的而言,你服务器代码回包的源端口必须是2400.

好了,可以结贴散分了。
  相关解决方案