c++ - 建立P2P TCP/UDP连接(NAT穿越)

标签 c++ go tcp udp p2p

有没有办法在没有中间服务器的情况下通过TCP或UDP建立真正的P2P通信?我知道如果两台计算机只有公共(public) IP 地址,这是非常可行的,但如果它们位于任何类型的 NAT 路由器后面或在专用网络上,它就会开始变得棘手。.事实上,我越看越觉得平淡不可能。我发现了 STUN、TURN 和 ICE 协议(protocol)以及打洞,但据我所知,它们都需要某种服务器来至少建立连接。我很惊讶看似如此简单的事情似乎很难做到,我错过了什么吗? 理想情况下,我正在寻找使用 Golang 的解决方案,任何帮助或 C++ 中的示例也会很有用,谢谢。

最佳答案

这不是严格意义上的围棋问题——这是一个一般的网络问题。

之所以如此困难,是因为 Internet 从未被设计为支持 NAT,NAT 刚刚发生并破坏了很多功能。解决您的问题的干净解决方案是切换到没有 NAT 的 IPv6,但这可能是不可能的

如果您的 NAT 盒支持 NAT-PMP 或 uPNP,您可以使用它。最简单的方法是创建一个绑定(bind)到 libminiupnpc 的 cgo,或者你可以去寻找一个原生的 Go 库。

如果您的 NAT 不支持这两种协议(protocol)中的任何一种,那么您可能就不走运了,因为打洞是一种脆弱而困难的技术,您可能会发现难以实现。

关于c++ - 建立P2P TCP/UDP连接(NAT穿越),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549502/

相关文章:

go - 如何在 Golang 中订阅多个 channel

go - "hot path"在sync.Once 的上下文中意味着什么?

google-app-engine - AppEngine/Go : urlfetch vs http. 获取等

networking - 跟踪路由 : Can it trace a path from A to B correctly?

c++ - 这个 [] 运算符是如何重载的?

c# - C#运算符重载是否像C++一样支持 "+="?

用于灵活性的 C++ auto 关键字

java - 当从 Java Tomcat Servlet 调用时,C++ 程序返回 -1073741515

Spring集成TCP,强制重连

actionscript-3 - ActionScript 3 : Port forwarding