假设我有一台服务器,并且有两台客户端连接到它。 (通过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实现将是最好的,但我将采取我得到的!
答案 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上的可靠协议:
答案 4 :(得分:0)
临时端口不会神奇地消除通过服务器中继的需要,因为它们仅在通过众所周知的服务端口打开的会话期间有效。短暂的端口基本上取决于服务器会话。
您需要使用服务器来中继两个客户端之间的通信,即充当代理服务器。一种选择是通过SSH代理服务器设置SSH隧道,并带来额外的安全性。
这仍然不能保证防火墙不会阻止连接。这取决于防火墙类型和配置。大多数作为防火墙的住宅路由器默认阻止所有传入连接。这通常很好,因为大多数情况下,防火墙后面的计算机只作为客户端启动与外部的连接。并且此设置有所不同,因为有些设置仅限于启动连接,例如HTTP,HTTPS,FTP,SFTP,SSH等众所周知的服务端口,如果您的代理服务器使用非众所周知的服务端口,则连接将是阻止。
但是防火墙也可以设置为阻止传出流量,这在公司网络中最常见,它甚至不允许直接连接到Web服务器并通过代理服务器路由所有内容,以控制资源使用。
您还可以研究使用UPnP动态打开端口。