两台计算机之间的通信没有打开端口,使用第三台计算机设置连接

假设我有一台服务器,并且有两个客户端连接到它。 (通过TCP,但没关系)

我的目标是允许这两个客户端之间的直接连接。 这是为了允许两个玩家之间的直接语音联系,例如,他们可能已经安装的任何其他不需要服务器交互的客户端插件(比如在两者之间玩某种随机游戏)。 服务器可以帮助您建立连接。

从duskwuff的回答中,我得到了几个线索:

http://en.wikipedia.org/wiki/STUN描述了这样做的算法,以及
http://en.wikipedia.org/wiki/UDP_hole_punching

从那些,我有更多的线索:

http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html
http://nutss.gforge.cis.cornell.edu/stunt.php – TCP的可能的STUN实现

随着时间的推移,我可以为我的计划找到一些东西。 现在我正在使用C ++和TCP(Qt套接字或Boost套接字),但如果需要,我不介意在C中执行UDP并将其包装起来。

对于任何具有C和C ++经验的程序员来说,可以通过链接到示例程序,更新的库或任何其他有用的信息来获得更轻松的提示。 一个文档化,灵活和有效的C ++ TCP实现将是最好的,但我将采取我得到的!

在NAT中打孔TCP漏洞有时/经常是可能的(它取决于NAT行为)。 这不是一个简单的学习主题,而是阅读有关实践JXTA II(可在Scribd上在线获取)进行NAT遍历的相应章节,以了解要解决的问题的性质。

然后,读这个 。 它来自那个写下的人: http : //nutss.gforge.cis.cornell.edu/stunt.php (你问题中的一个链接)。

我不是C / C ++专家,但要解决的问题不是特定于语言的。 只要您从代码库中访问TCP,就足够了。 请记住,实现UDP遍历比TCP更容易。

希望这些提示有所帮助

PS:我不知道该解决方案的C / C ++实现。 康奈尔的链接中提到的代码无法正常运行,如作者所证实。 我试着自己复苏,但是他让我知道它已经完全调整用于研究目的而且远非生产准备好了。

我不知道有什么办法可靠地穿过TCP的防火墙,但是有一种类似的UDP流量方法,有很好的记录:

您正在寻找用于NAT打孔的集合服务器 :可公开访问的服务器(不在NAT /防火墙之后或者它们已正确配置)以帮助NAT /防火墙后面的计算机建立对等连接。

UDP在NAT打孔中更受欢迎,因为它提供了比TCP更好的结果。 可以在此处找到UDP NAT穿孔的清晰且信息丰富的描述。

如果需要可靠的通信,可以使用UDP上的可靠协议:

  1. SCTP ( 库 ) – 标准化的,或
  2. 许多自定义协议之一,例如RakNet (我使用这个库,它非常成熟,function丰富,并且具有NAT冲压实现), Enet或许多其他协议(Q8)

短暂的端口不会神奇地消除通过服务器中继的需要,因为它们仅在通过众所周知的服务端口打开的会话期间有效。 短暂的端口基本上依赖于服务器会话。

您将需要使用服务器来中继两个客户端之间的通信,即充当代理服务器。 一种选择是通过SSH代理服务器设置SSH隧道,并带来额外的安全性好处。

这仍然不能保证防火墙不会阻止连接。 这取决于防火墙类型和配置。 大多数作为防火墙的住宅路由器默认阻止所有传入连接。 这通常很好,因为大多数情况下,防火墙后面的计算机只作为客户端启动与外部的连接。 此设置有所不同,因为有些设置仅限于启动连接,如HTTP,HTTPS,FTP,SFTP,SSH等众所周知的服务端口,如果您的代理服务器使用非知名服务端口,则连接将是受阻。

但是防火墙也可以设置为阻止传出流量,这在企业网络中最常见,它甚至不允许直接连接到Web服务器并通过代理服务器路由所有内容,以便控制资源使用。

您还可以研究使用UPnP动态打开端口。