2

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

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

从黄昏的回答中,我得到了几条线索:

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 实现将是最好的,但我会接受我得到的!

4

5 回答 5

3

我不知道有任何方法可以可靠地穿透 TCP 防火墙,但是对于 UDP 流量有一种类似的方法,该方法有很好的记录:

于 2011-09-07T00:44:32.937 回答
3

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

然后,阅读本文。它来自写这句话的人:http: //nutss.gforge.cis.cornell.edu/stunt.php(您问题中的链接之一)。

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

希望这些提示有所帮助。

PS:我不知道解决方案的 C/C++ 实现。康奈尔链接中提到的代码不经作者确认可操作。我试图自己恢复它,但他让我知道它完全是为了研究目的而调整的,远未准备好生产。

于 2011-09-10T20:19:52.960 回答
1

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

于 2011-09-09T18:36:08.397 回答
1

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

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

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

  1. SCTP图书馆) - 标准化之一,或
  2. 许多自定义协议之一,例如RakNet(我使用了这个库,它非常成熟且功能丰富,并且具有 NAT 穿孔实现)、Enet许多其他协议(Q8)
于 2011-09-13T10:04:11.707 回答
0

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

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

但这并不能保证防火墙不会阻止连接。这取决于防火墙类型和配置。大多数充当防火墙的住宅路由器默认阻止所有传入连接。这通常很好,因为大多数时候防火墙后面的计算机仅充当客户端,它们启动与外部的连接。而且这个设置会有所不同,因为有些限制启动连接只到众所周知的服务端口,如 HTTP、HTTPS、FTP、SFTP、SSH 等,如果您的代理服务器使用非知名服务端口,那么连接将是被封锁。

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

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

于 2011-09-07T01:49:54.830 回答