0

我正在处理涉及 Internet 上的 TCP 连接的学校编程项目。我不能在客户端上使用端口转发!有一个中继服务器工作。例如,客户端 A 不是连接到客户端 B 并发送数据,而是都连接到具有向 WAN 开放的端口的服务器,然后 A 将数据发送到服务器,服务器将其发送给 B。但是,这会花费额外的行程和使过程复杂化。

一般来说,我应该怎么做?有什么技巧可以让客户端直接通信,还是需要一个中继服务器?我以为 iChat 直接在客户端之间进行音频/视频聊天,但似乎不涉及端口转发或 NAT-PMP/UPnP。

万一这很重要,我在这个项目中使用了 Objective-C,在最后一个项目中使用了 Java,两者都在 Mac 上运行。

4

1 回答 1

0

这个问题非常广泛,但一般来说,您的应用程序必须知道对等方的地址才能连接到它。如果中间有路由器进行 NAT 或防火墙,这会使事情变得相当复杂(现在几乎所有地方都是这种情况 - 从安全角度来看,您的 PC 通常无法被网络之外的其他人访问是一件好事)。

所以第一步是弄清楚连接到哪里。如果需要连接的对等点不在防火墙或 NAT 之后,那么您可以为其分配 DNS 记录,然后您可以通过主机名访问它。DNS 记录的生存时间值可能较低,因此动态地址不是问题。您还可以使用充当注册表的服务器:您的客户端向其注册当前地址,并且还可以查询当前注册的客户端地址。

如果其中一个对等点位于 NAT/数据包过滤防火墙后面,那么您仍然可以从该设备连接到另一个不受这种限制的设备。

如果两个设备都受到限制,或者您希望能够从其中任何一个发起连接,那么您需要像您提到的那样的临时服务器,或者您必须“打孔”防火墙或要求您的路由器转发传入的连接到您的设备。NAT-PMP 或 UPnP 执行此操作。

还有更先进的技术。

我假设您使用 IPv4。IPv6 没有 NAT 的问题,但 IPv6 仍然普遍使用防火墙。

于 2013-09-27T20:10:28.193 回答