当前位置: 首页 > 知识库问答 >
问题:

Boost::ASIO中的NAT穿孔

张宝
2023-03-14

我正在尝试用Boost::ASIO实现NAT打孔。根据我的理解,NAT穿孔器的工作原理是这样的(UDP/TCP):

  1. 客户端A绑定到端口并连接到服务器S,客户端B执行相同操作。
  2. 当S同时接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A。
  3. a和B接收对方的ip和端口,现在它们从同一端口向对方发送消息并形成连接(因为它们正在等待回复?)

如果没有成功的async_connectasio::tcp::socket::connect,我似乎无法运行任何asio::async_write。当然,当目标端口没有转发时,这两个connect函数都会给我带来错误。

那么在这种情况下如何实现NAT打洞,是不是在Boost::ASIO中遗漏了什么?感谢任何帮助!谢谢你。

共有1个答案

颜新
2023-03-14

基于“客户端主动拒绝连接”错误,我假设您正在尝试TCP连接。UDP和TCP穿孔的工作方式有根本的不同。

3.A和B接收对方的ip和端口,现在从同一个端口向对方发送一条消息并形成连接(因为他们在期待回复?)

这不是TCP打孔的工作方式。由于TCP是点对点的,在步骤3中,您必须预测A或B的下一个传入端口,并且A或B需要尝试使用另一端的预测端口建立新的连接。显然有许多不同的NAT实现方式,并且不总是能够可靠地预测端口分配,尤其是在运营商级NAT的情况下。有关更多详细信息,请参见TCP打孔。作为TCP漏洞穿孔的替代方案,可以查看UPnP添加端口转发。

 类似资料:
  • 根据http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/cpp2011/futures.html,我们可以将boost::asio与一起使用。但是我找不到任何有关使用的信息,它具有更多的功能,例如。我怎么用?

  • 我知道这个话题并不新鲜。虽然存在各种信息,但健壮的解决方案并没有出现(至少我没有找到)。我有一个用python3编写的P2P守护进程,pie上的最后一个元素是通过TCP连接NAT后面的两个客户端。我得此主题得参考资料: https://bford.info/pub/net/P2pnat/ 如何使两个客户机在连接了一个汇点服务器后直接连接? TCP穿孔问题 到目前为止我所做的: 服务器: 现在,当前

  • 问题内容: 我试图在Java中实现UDP-Holepunching的简单草图以测试其概念,并稍后在我的C / C ++应用程序中使用它。 从Wikipedia来说,我的理解是:A和B是未定义网络结构背后的客户端,C是著名的公共可访问服务器。 A将数据包发送到服务器C,服务器保存其IP地址和端口。C将获得A的NAT的公共IP地址。这样做,A前面的NAT将创建一条路由,该路由会将此端口上的所有数据包传

  • epoll()可以对许多fd类型进行轮询,如普通fd、sockets、timefd、eventfd等。 Boost::ASIO::IP::TCP::Socket Boost::ASIO::IP::TCP::Acceptor Boost::ASIO::IP::UDP::Socket deadline_timer。 还有别的办法吗?

  • 问题内容: 我试图从boost :: asio运行SSL示例,并且在运行它们时遇到“无效参数”异常。我在Linux x86_64上。 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/ssl/client.cpp http://www.boost.org/doc/libs/1_46_1/doc/html/boost_a