【发布时间】:2011-11-11 18:23:41
【问题描述】:
假设我有一个服务器,有两个客户端连接到它。 (通过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 实现将是最好的,但我会接受我得到的!
【问题讨论】:
-
临时端口用于响应向众所周知的服务端口(即 HTTP、FTP 等)上的服务器发出的请求。这样服务器知名服务端口在响应请求时不会被阻塞,并且可以接受新的连接。例如,当您打开 FTP 连接时,初始请求通过端口 20,服务器接受连接请求并启动一个进程以在另一个端口(临时端口)上处理该会话。如果所有会话都通过同一个端口,则一次只能有一个会话保持连接。
-
@Xint0:这不太准确。 HTTP 根本不涉及“临时端口”。连接由本地 ip、本地端口、远程 ip 和远程端口的唯一元组标识。只要远程 ip 或远程端口对于任何给定的不同连接对不同,就可以在单个本地 ip 和端口上容纳操作系统可以处理的尽可能多的连接。
-
@R.. 当我写 HTTP 时,我指的是端口号 80,它是 HTTP 服务器众所周知的服务端口。 HTTP 是应用层的协议。临时端口用于传输层(TCP、UDP 等)
-
也许您可以澄清一下,但是当我阅读您的评论时,这是错误的。具体来说,“如果所有会话都通过同一个端口,则一次只能有一个会话保持连接”这句话。不是真的。
-
另一个重要信息可能是用 TCP 套接字替换 UDP 套接字的可能性,如果路由器没有检测到并阻止它。
标签: c++ c p2p hole-punching