我正在尝试构建一个点对点游戏,其中每个玩家都是服务器和带有tcp套接字的客户端。当我使用本地ip:s时,套接字可以正常连接,但当我尝试使用外部ip:s时当然会失败。
但我认为如果玩家只知道路由器分配给他们的外部地址+端口,他们应该能够相互连接。如果问题是设置端口转发,因为我无法访问播放器路由器。
我想在两者之间安装服务器,只是为了能够读取播放器的外部地址和端口,并告诉其他播放器它可以连接。
但是我没有在任何地方找到任何信息,如果这是端口转发的工作方式。如果计算机A从本地地址和服务器端口发出请求,并且路由器将此地址+端口分配给外部地址+端口,则服务器告诉计算机B使用哪个地址+端口。计算机B可以使用该外部地址+端口连接到计算机A并启动它的tcp套接字吗?当另一台计算机发出请求时,有没有办法知道这个外部地址+端口保持不变?
问题是大多数人不会将他们的PC直接暴露在互联网上。他们有一个具有外部地址的路由器。当您将数据包发送到其IP地址时,它将转到其路由器。路由器不知道将其转发到哪里以及在没有端口转发的情况下使用哪个端口。
因此,让每个人都能启用端口转发是不可能的,因为它应该是。更简单的机制是在您控制的Internet上安装服务器。它有一个带端口转发设置的防火墙。客户端只是客户端,它们通过端口连接到服务器,并发送和接收有关游戏当前状态的信息。这样,每个人都可以在本地游戏引擎上进行实时更新。另外,这种方式更容易编程和实现。
不,TCP不能那样工作。
用于与集合点服务器通信的源端口将是瞬态的并且特定于该特定的初始TCP套接字连接,并且只能用作来自集合点服务器的同一连接上的返回流量的目标,并且不能是由第三方用于建立新的入站连接。
当涉及NAT并且端口转发不可用时,典型的(仅?)实用解决方案是让中央服务器在对等体之间双向地中继所有消息。