【问题标题】:Java Servlet Returns Remote Port of 0?Java Servlet 返回远程端口 0?
【发布时间】:2012-04-27 04:55:52
【问题描述】:

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

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

我的最终目标是能够在查找收件人地址和外部端口位置时告诉连接发起方,以便 TCP 打孔技术能够正常工作。

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

【问题讨论】:

  • 这是一个bug
  • 这很烦人。谢谢。

标签: java android networking servlets tcp


【解决方案1】:

我不确定为什么 getRemotePort 会返回 0,但为了您的最终目标,知道客户端端口是无用的。为每个连接重新分配客户端端口。事实上,如果第一个连接使用 55046,则客户端端口的全部意义在于让新连接使用不同且未使用的客户端端口号。

这使得配置防火墙策略漏洞的信息毫无用处。您将不需要客户端端口。您需要的是服务器端口、服务器地址以及可选的客户端地址(如果您只想允许从该客户端地址进行访问)。

【讨论】:

  • 难道您不通过让主机启动与客户端地址的连接(失败)然后让客户端启动与主机的连接来“打孔”吗?也许这只适用于 UDP...
  • 通过漏洞,我正在考虑防火墙策略中的漏洞。我不知道你在说什么。我不知道主机发起与客户端连接的协议。这将使主机成为客户端,而客户端将成为服务器。所以我不确定你说的客户是什么意思,也不知道你在说什么。
  • NAT 遍历。 P2P客户端---->服务器 主机 |客户端 主机
  • 当我说我不知道​​你在说什么时,我是认真的。你可能知道,但你一定在谈论我不知道的事情。虽然 NAT 与防火墙不同,但它通常是防火墙产品的一个功能,所以我认为您的需求与您的 NAT 产品的具体情况有关。
  • 用于 NAT 穿越的方法通常适用于 3/4 种不同类型的 NAT 路由器。这不是我的路由器特有的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多