2011-09-07 59 views
2

假设我有一台服务器和两台连接到它的客户端。 (通过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 - 一个可能的STUN实现,使用TCP

随着时间的推移,我肯定可以为我的计划制定一些计划。现在我使用C++和TCP(Qt套接字或Boost套接字),但是如果需要的话,我不介意在C中做UDP并封装它。

赏金是有与++的C和C,可能会给提示,使这更容易,通过链接到示例程序,更新库,或任何其他有用的信息,任何有经验的程序员。有记录的灵活的工作C++ TCP实现将是最好的,但我会拿我得到的!

+1

临时端口被用于向一个**知名的服务端口到服务器的请求响应* *(即HTTP,FTP等)。这样服务器众所周知的服务端口在响应请求时不会被阻塞,并且可以接受新的连接。例如,当您打开FTP连接时,初始请求会通过端口20,服务器接受连接请求并启动一个进程以在另一个端口(临时端口)上使用该会话。如果所有会话都通过同一个端口,则一次只能有一个会话保持连接。 – Xint0

+2

@ Xint0:这不太准确。 “临时端口”根本不涉及HTTP。连接由本地ip,本地端口,远程ip和远程端口的唯一元组标识。只要远程IP或远程端口对于任何给定的一对不同的连接都不同,就可以在单个本地IP和端口上安装许多可以处理的连接。 –

+0

@R ..当我写HTTP时,我指的是HTTP服务器众所周知的服务端口号80。 HTTP是应用层的协议。临时端口用于传输层(TCP,UDP等) – Xint0

回答

3

在NAT冲压TCP孔有时/经常可能的(它取决于NAT行为)。这不是一个简单的学习内容,但请阅读实用JXTA II(可在Scribd上在线获得)中有关NAT穿越的相应章节,以了解要解决的问题的性质。

然后,阅读this。它来自那个写这个的人:http://nutss.gforge.cis.cornell.edu/stunt.php(你的问题中的一个链接)。

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

希望这些提示帮助。

收录人:我不知道该解决方案的C/C++实现。 Cornell链接中提到的代码在作者确认的情况下不可用。我试图自己复活,但他让我知道它完全是为了研究目的而调整的,而且远没有准备好。

3

我不知道有什么方法可以可靠地通过防火墙的TCP冲,但有UDP通信类似的方法,这是相当有据可查:

+0

UDP穿孔是一种在使用网络地址转换器的专用网络中的Internet主机之间建立双向UDP连接的方法。该技术不适用于所有场景或所有类型的NAT,因为NAT运行特性不是标准化的。 - 当场!我会等一下看看其他的回应 – coyotte508

0

临时端口不会神奇地消除通过服务器中继的需要,因为他们是唯一有效d通过一个着名的服务港开启会议的生活。基本上,临时端口取决于服务器会话。

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

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

但防火墙可以设置为阻止传出流量也,这是最常见的企业网络,甚至不容许通过代理服务器的Web服务器和路由都直接连接,以控制资源的使用。

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

+0

谢谢,它似乎短暂的端口不工作。虽然我不知道如何处理临时端口,但如果服务器会话建立或延续不是由操作系统直接管理,而是由低级代码管理的,那么希望找到一个允许调整的库。无论如何,duskwuff的帖子证明了它可能在UDP中,所以确实有办法做到这一点,即使我需要更多地考虑它,也许它不使用临时端口。 – coyotte508

1

您正在寻找的NAT打孔会合服务器:即公开访问(不落后NAT /防火墙或他们正确配置)的服务器,以帮助落后NAT /防火墙的计算机建立对等网络连接。

UDP在NAT打孔中比较流行,因为它提供比TCP更好的结果。 UDP NAT穿孔的清晰和信息性描述可见here

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

  1. SCTPlibraries) - 标准化的一个,或
  2. 的许多自定义协议之一,例如RakNet(我用的这个库,这是相当成熟的,功能丰富,具有NAT冲压实现),Enetmany others (Q8)
相关问题