Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 增压器中的NAT打孔::asio_C++_Tcp_Boost Asio_Nat - Fatal编程技术网

C++ 增压器中的NAT打孔::asio

C++ 增压器中的NAT打孔::asio,c++,tcp,boost-asio,nat,C++,Tcp,Boost Asio,Nat,我正在尝试用boost::asio实现NAT打孔。据我所知,NAT穿孔的工作原理如下(UDP/TCP): 客户端A绑定到一个端口并连接到服务器S,客户端B也这样做 当S接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A A和B互相接收对方的ip和端口,现在他们从同一个端口互相发送消息并形成连接(因为他们希望得到回复?) 因此,在boost::asio中,我能够实现步骤1-2,但由于两个客户端都没有端口转发,如果我尝试从一个客户端连接到另一个客户端,它只会给我错误,如“客户端主动拒绝连接”

我正在尝试用boost::asio实现NAT打孔。据我所知,NAT穿孔的工作原理如下(UDP/TCP):

  • 客户端A绑定到一个端口并连接到服务器S,客户端B也这样做
  • 当S接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A
  • A和B互相接收对方的ip和端口,现在他们从同一个端口互相发送消息并形成连接(因为他们希望得到回复?)
  • 因此,在boost::asio中,我能够实现步骤1-2,但由于两个客户端都没有端口转发,如果我尝试从一个客户端连接到另一个客户端,它只会给我错误,如“客户端主动拒绝连接”或“客户端无响应”(令人惊讶的是,这两个客户端即使使用相同的功能,也会有不同的错误)

    如果没有成功的
    async\u connect
    asio::tcp::socket::connect
    ,我似乎无法运行任何
    asio::async\u write
    。当然,当目标端口未转发时,这两个连接函数都会给我错误

    那么,在这种情况下,我如何实现NAT打孔呢?我是否在boost::asio中遗漏了什么?感谢您的帮助!谢谢。

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

    三,。A和B互相接收对方的ip和端口,现在他们从同一个端口互相发送消息并形成连接(因为他们希望得到回复?)


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

    我建议您改进您的问题,添加一些示例和代码,并使其更清晰,请看这里=>您好,我已经编辑了有关我使用的函数的更多信息。我可以知道你的问题中有什么不清楚吗?谢谢Sam,问题是它本身很好,我的意思是如果你有一些代码可以共享,那么它更适合堆栈溢出准则。不幸的是,我不能回答你的问题,因为我不是C++开发人员,但我知道堆栈溢出以及它如何工作得很好。您应该始终提供一些源代码,以便该领域的用户专家(本例中为C++)能够更好地帮助您,不仅您可以获得更快的答案,而且可以获得更高质量的答案,避免被否决,甚至在不够清楚的情况下关闭问题。这只是一个建议:-看起来路由器/防火墙没有合作来实现这一点。我明白了,谢谢你纠正我,我是不是在描述UDP打孔?但是,关于预测另一个客户端的端口,我能够验证这两个客户端是否都从它们用于服务器S的相同端口发送连接,因此服务器S确实传递了正确的端口号,因此似乎不需要预测。我知道它
    需要在TCP套接字上使用SO_REUSEADDR
    ,因此我也确保它也处于启用状态。不过,我现在先试试UDP。谢谢你的回复!至于UPnP,我已经有了备份计划,但不幸的是,我国的主要ISP在默认情况下禁用了用户调制解调器(IKR)上的UPnP,所以我不能依赖它。NAT PMP也是如此。不过还是谢谢你的建议。是的,你描述了打孔。如果您的NAT使用端口保留分配方案,那么您可以简单地分配一个新端口,并通过服务器(或UDP)与另一端通信。然后继续进行TCP连接建立,如中所述。