如何在连接到服务器的客户端之间启动直接连接

时间:2013-05-29 10:50:38

标签: networking tcp network-programming connection

假设我有一台服务器并且客户端已连接到服务器。可以通过公共IP访问服务器。

我想“转发”连接,以便客户端可以直接连接到彼此,而不需要服务器在中间。

我不知道这是否可行,我自己也找不到办法。

其他假设:

  • 两个客户端都没有公共IP,两个客户端都在NAT后面
  • 如有必要,可以启动更多连接

我正在寻找一种严格的软件解决方案,无需重新配置路由器,打开端口等等。

我希望实现此目的的原因是减少服务器上的负载。一旦两个客户端关联在一起,就没有真正的需要(技术问题除外)继续使用服务器作为一种代理。直接客户端连接也会减少连接的延迟。

4 个答案:

答案 0 :(得分:4)

看看http://en.wikipedia.org/wiki/UDP_hole_punching。如果两台机器都没有公共IP,并且您无法打开端口,并且您不希望所有数据都通过服务器,则这可能是唯一的其他可能选项。如果这对您不起作用,您可能会遇到通过服务器的所有数据。如果您可以设置端口转发,这将提供更好的解决方案,那么只需使用服务器来交换IP和端口信息(因为它在建立连接时存在)。

答案 1 :(得分:2)

简短的回答是:这是不可能的。

其中一个主要问题是路由器不知道从服务器(或其他客户端)重定向请求的位置。只是一个案例:你的路由器背后有多个设备(电脑,手机......)。它得到一个请求,不知道,谁想要获得请求。

有一种解决方法,但它不可靠(总是不起作用。)如果有可能,有些公司会使用它,但如果它失败,它们总是替代它(如通过服务器通信)。它被称为nat冲孔。更多详情:http://en.wikipedia.org/wiki/TCP_hole_punching

我不知道你需要什么原因。如果你需要它用于客户端服务器连接,你可以使用像长轮询,回调....

否则您需要设置路由器,或者通过服务器进行路由。

答案 2 :(得分:2)

你可以做两件事,一件是打孔http://en.wikipedia.org/wiki/TCP_hole_punching 所以这将允许您响应NAT后面的客户端(您可以配置您的客户端发送他们使用的私有IP和端口号来回复它们)。

您可以做的其他事情是通过Skype进行对等网络,并将其中一个客户端作为中继网络,并跟踪活动中继并定期更新它们。 (见http://en.wikipedia.org/wiki/Skype_protocol

所以现在你的服务器必须只是作为代理和管理员,管理所有连接,但通过它的信息量最少。

我希望这有帮助。

答案 3 :(得分:1)

某些家用路由器支持upnp,可以指示打开某个端口并将其转发到LAN上的某个客户端。

您可以在GNU / Linux上使用 upnpc 来打开路由器上的端口。它还有一个用C代码完成它的库(但它没有很好地记录)。

但是,此方法可能无法在所有家庭设备上运行,因此在这种情况下,请参阅其他答案。