c - 无需设置路由器即可向世界开放网络应用

标签 c networking router

请考虑以下基本网络设置:

  • 机器 A 和 B 是本地网络的一部分,并且都连接到网络路由器。
  • 机器 C 的设置相同,但在另一台路由器上,距离第一个路由器很远。
  • 网络路由器分配有一个全局可见的 IP 地址。

Basic home network setup

如您所见,机器 A 正在运行一个名为 myserverapp 的自制服务器应用程序。该应用程序是用 C 语言编写的,并在端口 5000 上监听传入数据包/连接。它通过 IP 套接字遵循基本的网络概念。通过上述配置,只有机器 A 和 B 可以访问此应用程序(通过 192.168.1.60:5000)。

通过在第一个路由器的配置中设置网络端口转发规则,我可以允许 1.2.3.4:5000 在本地解析为 192.168.1.60:5000。请注意,这需要实际的路由器设置

我的目标是允许访问 ./serverapp,无需在路由器配置中设置转发规则。我希望我的应用程序能够自行请求全局 IP 绑定(bind)。举个例子,Skype(现在不是一个很好的例子)、Transmission 和许多其他网络都可以在全局范围内访问,但不需要我为它们设置端口转发规则。

现在,我知道这是一个经常出现的问题,但这里有一些其他情况:

  • 我试过 punching a UDP hole允许点对点通信,但显然我的路由器不喜欢它。尽管我可以通过中继服务器同步对等点列表,但之后这些对等点无法相互联系。我也无法在服务器提供的端口上使用 nc 实用程序访问它们。

  • UPnP 在很多路由器上都没有启用,即使是现在,而且似乎还存在争议。目前,这不是一个选择。另外,请注意,这还需要设置路由器(激活 UPnP)。

  • (来自评论)默认情况下,我的路由器转发任何端口:仅转发我设置的端口。另外,我正在寻找一种适用于更多路由器的解决方案,而不仅仅是我的路由器。

另请注意,这编程相关:我知道这主要是一个网络问题,但我正在寻找实现解决方案。我并不是在寻求设置网络本身的帮助(实际上,这正是我想要避免的)。

现在,我的问题是:是否有一种适用于 C 的众所周知的技术来允许在路由器后面进行点对点通信?有相关的库吗? 许多 P2P 软件都可以在大多数计算机上运行,​​甚至是我的计算机(我无法为此创建 UDP 漏洞),但我只是不明白它们是如何实现这一点的。

最佳答案

您引用的许多应用程序都使用没有 NAT 的中央服务器,即使只是为了反弹数据包。两个客户端设备都联系中央服务器,从而有效地使两个端点相互联系。

你想要做的就是NAT穿越。以下是两种众所周知的方法:STUN(请参阅 here )和 TURN(请参阅 here )。

关于c - 无需设置路由器即可向世界开放网络应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22747344/

相关文章:

c++ - 从串行 Arduino C 读取符号之间的数据

c - 通过指针分配数组元素值时出现问题

UFW 阻止了 Docker 本地主机连接

c - 在哪个阶段分配源端口?

angular - 检测所有 Angular2 组件中的路由变化

c - 在 C 中使用 strtok 将日期字符串转换为整数

c - Scanf() 不等待整数输入

android - 检测 android 上的不良网络连接

javascript - 如何在运行时向 Ember.Router 添加路由或状态?

java - 如何将您的 PC 变成使用 tomcat 的 Web 服务器