【问题标题】:How can I open a TCP/UDP port on my NAT to configure a P2P application?如何在 NAT 上打开 TCP/UDP 端口来配置 P2P 应用程序?
【发布时间】:2014-06-30 12:26:57
【问题描述】:

我正在用一个 PHP 远程服务器作为跟踪器在 Delphi XE5 中开发一个 P2P 应用程序,以列出客户端套接字。如果客户端的 NAT 决定关闭/阻止它在发送到 PHP 远程服务器的第一条消息中创建的随机端口,我担心使用 UDP 打孔 会失败。

所以我知道如何从客户端(用 Delphi 编写)使用 NAT 进行更长时间的持久端口配置。我不希望我的用户需要知道如何访问路由器并自己配置端口转发。

我是否可以这样做并使用服务器仅在没有 PHP-P-H 的情况下存储套接字,并确保至少在 Delphi 的应用程序运行时端口将保持打开状态?

如果我决定从远程服务器使用 UDP 打孔,如果没有其他用户直接连接到它(P2P),NAT 是否会保持对用户本地 PC 开放的端口足够快?

如果我用 UDP 打开那个端口,之后我可以使用 TCP 吗?

Obs:Delphi XE5 可以编译到 Windows 32 和 Android,所以我需要一个非 Windows Only 解决方案。

【问题讨论】:

标签: delphi tcp udp p2p nat


【解决方案1】:

Microsoft 有一个 API 用于通过 uPNP 处理 NAT,尤其是用于分配端口映射。查看IUPnPNAT 接口及其StaticPortMappingCollection 属性。使用IStaticPortMappingCollection.Add 分配NAT 中的端口。

当然,这只适用于已打开 uPNP 的路由器。并非所有路由器都支持 uPNP,或者启用了 uPNP。

【讨论】:

  • 谢谢,但有没有不绑定到 Windows 的解决方案?我希望在 Windows 和 Android (XE5) 中也能使用它
  • 所以这个 uPNP 可用性问题告诉我,我真的应该使用 UDP 打孔,对吧?
  • Android 没有自己的 uPNP API,因此您必须找到第三方实现(注意它仅适用于 Wifi 连接,not on a wireless connection)。但是,如果您一开始就没有使用支持 uPNP 的路由器,那将无济于事。如果您真的想变得健壮,您将不得不在您的应用程序中使用多种 NAT 遍历技术(打孔是其中之一),就像大型应用程序一样。
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 2017-03-25
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2013-08-28
  • 2016-06-06
相关资源
最近更新 更多