假设我有一台服务器并且客户端已连接到服务器。可以通过公共IP访问服务器。
我想“转发”连接,以便客户端可以直接连接到彼此,而不需要服务器在中间。
我不知道这是否可行,我自己也找不到办法。
其他假设:
我正在寻找一种严格的软件解决方案,无需重新配置路由器,打开端口等等。
我希望实现此目的的原因是减少服务器上的负载。一旦两个客户端关联在一起,就没有真正的需要(技术问题除外)继续使用服务器作为一种代理。直接客户端连接也会减少连接的延迟。
答案 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代码完成它的库(但它没有很好地记录)。
但是,此方法可能无法在所有家庭设备上运行,因此在这种情况下,请参阅其他答案。