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

时间:2011-09-07 00:40:48

标签: c++ c p2p hole-punching

假设我有一台服务器,并且有两台客户端连接到它。 (通过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实现将是最好的,但我将采取我得到的!

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

然后,阅读this。它来自于撰写该文章的人:http://nutss.gforge.cis.cornell.edu/stunt.php(您问题中的一个链接)。

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

希望这些提示有所帮助。

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

答案 2 :(得分:1)

可能感兴趣或有帮助的项目的一些链接:

答案 3 :(得分:1)

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

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

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

  1. SCTPlibraries) - 标准化的,或
  2. 许多自定义协议之一,例如RakNet(我使用了这个库,它非常成熟且功能丰富且具有NAT冲压功能),Enetmany others (Q8)

答案 4 :(得分:0)

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

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

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

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

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