NAT洞打孔与ENet

时间:2014-07-08 14:46:38

标签: c++ ios udp nat enet

我一直在寻找一个简单的UDP C ++库,它现在可以提供一段时间的可靠性。我刚遇到ENet,看起来很完美,除了我在文档中找不到任何支持NAT打孔的内容。互联网似乎有一些人在讨论这个问题,但我还没有找到一个明确的答案,是否有可能。

我已经有第三方服务器配置为分发外部ips&港口到客户。

如果有可能,有人可以给出描述该过程的伪代码/步骤吗?

3 个答案:

答案 0 :(得分:4)

我想出来了。这是我做的:

  1. 为当前客户端创建主机
  2. 连接第三方服务器
  3. 当另一个客户端连接到第三方服务器时,它会将其他客户端信息发送给每个客户端
  4. 收到对等体地址后,每个对等体尝试连接到用于连接服务器的同一套接字上的另一个对等体,并开始向该地址发送数据包。这最初是我的问题。我一直只发送几个数据包,很容易丢失。连接只能工作一半的时间。我最终产生了一个发送数据包的线程,直到连接成功或失败。
  5. 应在发送几个数据包后建立连接

答案 1 :(得分:1)

使用STUN进行打孔,然后使用ENet
与STUN-Server通信并检索公共端点 NAT类型。确保NAT类型已打开,然后继续=>在用于与STUN-Server通信的套接字上使用 getsockname ,以获取本地端点,然后关闭该套接字。
现在创建ENet服务器并使用本地端点对其进行初始化。现在,来自其他计算机的ENet客户端可以使用公共端点连接到服务器。

答案 2 :(得分:-1)

UDP可能会丢弃数据包,并且可能无序地发送数据包。 订购数据包是微不足道的。 但是如果丢弃了一个数据包,就无法恢复它。但是,许多执行UDP的系统将为您提供另一个包含重复数据的流。在这种情况下,您可以简单地使用辅助流创建备份,然后更新检查第一个流中丢弃的数据包是否在第二个流中可用。