从本地网络(WinSock,C)与公共(public) IP 通信

标签 c windows sockets lan

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

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

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

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

最佳答案

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

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

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

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

关于从本地网络(WinSock,C)与公共(public) IP 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7246177/

相关文章:

c - GTK3+ - 如何根据鼠标点击更新图形?

linux - 使用pscp将文件从windows传输到linux box

c++ - 为什么这个循环会破坏我的内存?

swift - 套接字阻塞 UI 的挑战(我相信是这样)

c - 在c中的函数中外包strtok()

c - X11:如何使应用程序位于顶部

sql-server - 启动 AX 2012 R3 服务时出错

java - 通过套接字连接在 Java 中处理字节流

PHP socket_read() 只获取流的第一个字节

与 execv 通信()'ed program via pipe doesn' t 工作