c++ - 通过 Internet 发送 UDP 数据报

标签 c++ sockets networking udp skype

<分区>

我是网络新手...我有一个(愚蠢?:))关于 UDP 通信的问题。

我基于 boost::asio 库创建了两个简单的程序:一个服务器和一个客户端。 这两个程序通过 UDP 套接字进行通信。客户端连接到服务器并开始传输数据报。

它在我的局域网中运行良好。我使用 IP 地址连接服务器(例如 192.168.1.111)。

如果我的服务器应用程序在其他 LAN 中工作,而客户端必须通过 Internet 连接怎么办?我如何到达服务器?

我知道的唯一可能的解决方案是:

  • 端口转发(不安全?)
  • VPN(过于复杂)

有没有更好的解决方案?

某些应用程序(如 Skype 或 LogMeIn...)如何在没有 VPN/端口转发的情况下工作,并且一个 LAN 中的用户可以访问其他 LAN 中的任何计算机?

最佳答案

Are there better solutions?

是的。

Skype 使用 Hole Punching trick .

假设 A 想联系 B:

  • A和B连接到服务器C

  • 服务器 C 告诉 B 向 A 发送虚拟 UDP 数据包(发送到使用的 IP 和端口 通过 A for Skype 连接)有效地在自己身上打了一个洞 (B) 防火墙

  • 这个数据包被 A 丢弃了(它来自 NAT 之外)但是现在 A 可以向 B 发送 UDP 数据包,这将使它们通过防火墙( B 路由器认为这是对 [dummy] 数据包的响应)

本文对其进行了更详细的描述: How-Skype-Co-get-round-firewalls

关于c++ - 通过 Internet 发送 UDP 数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22393356/

相关文章:

ssl - javax.net.ssl.SSLException : No PSK available. 无法恢复

c++ - 如何转换 RGB -> YUV -> RGB(双向)

.net - 在同一个套接字上可以进行多少个异步套接字请求?

c++ - C++ 中的 TCP/IP 服务器不等待客户端

c++ - 从不同线程写入 boost::asio 套接字

apache - 使用本地网络中的 xampp 服务器托管站点,无需端口转发

c++ - 继承时删除重复的模板类型名条目

c++ - OpenCV 中的调试断言错误

c++ - Q_INVOKABLE 方法返回自定义 C++ 类型

java - 大量数据 - 发送它们的最佳方式是什么?