【问题标题】:Communicate to public IP from a local network (WinSock, C)从本地网络与公共 IP 通信(WinSock,C)
【发布时间】:2011-08-30 16:02:40
【问题描述】:

我是这个论坛的新手(至少在提问方面),所以请耐心等待。我正在尝试编写简单的客户端-服务器应用程序以使用数据报 (UDP) 套接字与 C 和 Windows 进行通信。

场景非常简单,我希望能够从某个本地网络(在网关/NAT 之后)的机器向具有公共 IP 的某个主机发送/接收数据。我可以发送数据,但似乎无法接收到任何数据,因为远程服务器看不到客户端的本地 IP。

我不希望用户在 GATEWAY 上执行手动端口转发,并且由于安全问题我也不想使用 UPnP(尽管它也应该由用户启用)。

我认为这是可能的,因为像 Skype 或浏览器这样的应用程序可以做到这一点,但如何做到呢? 是否有一些自动转发的端口或类似的东西?我已经厌倦了在网上搜索...请帮助!

【问题讨论】:

  • 确实,问题类似,但没有答案。我不希望用户手动执行端口转发或启用 UPnP。
  • 我在暗示我的答案,STUN 是获取您的公共 IP 地址的机制,libjingle 是一种无需端口转发、UPnP 或 NAT-PMP 即可实现打孔的便捷方式。
  • 好像和caf的解释很像。我没有注意到,对不起,谢谢大家的帮助。

标签: c windows sockets lan


【解决方案1】:

对于 UDP 连接,大多数家庭 NAT 网关会自动为每个出站数据包创建一个临时反向映射。

假设您的客户端在 IP 地址为 192.168.4.5 的内部计算机上运行,​​通过外部 IP 地址为 192.0.43.10 的网关从端口 65000 向外部地址 64.34.119.12:6789 发送 UDP 数据包。当网关看到您的内部客户端从192.168.4.5:65000 向外部地址发送UDP 数据包时,它会将其NAT 到外部地址和端口,例如192.0.43.10:5500。您的服务器将看到一个源地址为192.0.43.10:5500 和目标地址为64.34.119.12:6789 的数据包。路由器还设置了一个反向映射,因此如果它看到一个数据包到达外部接口,其源为64.34.119.12:6789,目标为192.0.43.10:5500,它会将其重定向回192.168.4.5:65000。此映射通常会在片刻后超时。

这意味着在简单的情况下,您需要做的就是:

  1. 在客户端,使用同一个端口发送到服务器并监听响应;
  2. 在服务器上,使用与接收数据包相同的服务器端口,在接收到客户端数据包的地址和端口处响应客户端;
  3. 让客户端在会话中发送初始数据包;
  4. 一次不要让“连接”闲置超过几分钟。

【讨论】:

  • 这个答案+1。此外,根据您的本地 PC 配置,您可能需要禁用本地防火墙软件或将其配置为允许该程序接收数据。此外,如果您的程序是“服务器”并且位于 NAT 之后,您可能需要配置 NAT 以进行端口转发。
  • 非常感谢,咖啡馆!我知道这是网关中的某种黑魔法。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 2015-03-06
  • 2012-08-03
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
相关资源
最近更新 更多