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

时间:2011-08-30 16:02:40

标签: c windows sockets lan

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

考虑一种情况,您的客户端在IP地址为192.168.4.5的内部计算机上运行,​​通过外部网关从端口65000向外部地址64.34.119.12:6789发送UDP数据包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的数据包。路由器还设置了反向映射,因此如果它看到数据包到达外部接口的源64.34.119.12:6789且目的地为192.0.43.10:5500,它会将其重定向回{{1} }。此映射通常会在一段时间后超时。

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

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