2012-04-15 60 views
0

我正在使用部署在Google AppEngine上的servlet来响应客户端的远程端口号。 HttpServletRequest.getRemoteAddr()工作正常,但getRemotePort()返回0?Java Servlet返回0的远程端口?

端口0无效。我尝试了其他IP服务,告诉我正常的端口号(即55046或其他),但每次从浏览器或Java代码访问时,我的servlet都会返回0。

我的最终目标是能够在查找收件人的地址和外部端口位置时告诉连接启动器,这样TCP打孔技术就能正常工作。

,这是什么原因呢?我如何获得实际的端口号(如果可能的话)? NAT路由器不使用代理端口吗?

+1

这是一个[bug](http://googleproof.org/gsubdomainiscode/p/googleappengine/issues/detail?id=4210) – tenorsax 2012-04-15 17:51:25

+0

好吧,这很烦人。谢谢。 – bgroenks 2012-04-15 17:55:01

回答

0

我不知道为什么getRemotePort会返回0,但为了您的最终目标,知道客户端端口是无用的。客户端端口被重新分配给每个连接。实际上,如果第一个连接使用55046,则客户端端口的全部点是为了使新的连接使用另一个未使用的客户端端口号。

这使得它在防火墙策略中配置一个漏洞无用的信息。你不需要客户端口。如果您只想允许来自该客户端地址的访问,您需要的是服务器端口,服务器地址以及可选的客户端地址。

+0

不要让主机发起连接到客户端地址(失败),然后让客户端启动到主机的连接,从而“打洞”吗?也许这只适用于UDP ... – bgroenks 2012-04-17 03:21:33

+0

漏洞,我在思考防火墙政策的漏洞。我不知道你在说什么。我不知道主机发起到客户端的连接的协议。这将使主机成为客户端,客户端将成为服务器。所以当你说客户时,我不确定你的意思,也不知道你在说什么。 – 2012-04-17 12:16:33

+0

NAT穿越。 P2P客户端---->服务器<-----主机 | 客户端<-----服务器----->主机 | 客户<----->主机 – bgroenks 2012-04-19 22:10:40