多人游戏的中继服务器 - UNet

Relay Server For Multiplayer Games - UNet

几周来我一直在为这个问题苦苦挣扎,但我找不到任何可以帮助我的东西。用于多人网络的 Unity 拓扑(我所知道的)是主机-客户端。主机开始游戏,客户端使用 ip:port 连接到主机。当其中一方在 NAT 后面时,问题就开始了。无视这一事实,我开发了一个网络服务,使用 php 来注册主机的 ip 和端口,当客户端请求时,return 现有主机之一(ip、端口、游戏名称等) .你猜对了,那是一个彻底的失败,至少对 NAT 来说是这样。

所以现在我唯一能确定的是,我获胜的唯一方法就是拥有一个中继服务器。但是我不知道具体怎么做。

这是我到目前为止尝试过的方法:

使用 Socat:socat UDP4-RECVFROM:50000,fork UDP4-SENDTO:HOST_IP_ADDR:HOST_PORT

其中50000是客户端在networkManager.networkPort中使用的端口,而networkManager.networkAddress显然是我服务器的IP地址。我从我提到的 php 网络服务中获得了 HOST_IP_ADDRHOST_PORT。没用。

我尝试的下一件事是使用 this python script 作为 UDP 代理服务器,使用 ./udp-relay.py 50000:HOST_IP:HOST_PORT,我再次从网络服务中获得了主机 IP 和端口。之后我相应地统一设置 Network.proxyPortNetwork.proxyIP(我的服务器 ip 和端口 50000);这也没有用。

那么,我离我想要实现的目标还差得很远吗?

谢谢大家

编辑:

我想使用中继服务器,这样它就能 100% 正常工作,而不是打孔,因为它不适用于所有路由器。

您要查找的东西称为 NAT 打孔或穿通。

https://en.wikipedia.org/wiki/UDP_hole_punching

这里有一些关于如何操作的有用信息:

http://www.brynosaurus.com/pub/net/p2pnat/

您需要一个不在 NAT 后面的引入服务器。但它只需要建立通信,而不是中继数据包。如果玩家落后于行为不端的 NAT,您只需要进行中继。