C++ 增压器中的NAT打孔::asio
我正在尝试用boost::asio实现NAT打孔。据我所知,NAT穿孔的工作原理如下(UDP/TCP):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,但由于两个客户端都没有端口转发,如果我尝试从一个客户端连接到另一个客户端,它只会给我错误,如“客户端主动拒绝连接”
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连接建立,如中所述。