允许人们在没有端口转发的情况下主持他们自己的多人游戏吗?

Allow people to host their own multiplayer without port forwarding?

现在 Steam 上有很多游戏(Table 顶级模拟器、SpeedRunners)允许人们在不需要端口转发的情况下托管自己的在线多人游戏matches/games。

关于他们是如何做到这一点的,我想到的一件事是他们只有一个服务器,将所有匹配作为单独的线程进行处理。

但后来我开始怀疑瓶颈问题。

然后我听说这些游戏只是以某种方式让 TCP 通过其 NAT 打洞,从而不再需要端口转发。

但是怎么说,C++ 使用 winsock,会这样做吗?还是 GameMaker: Studio?或者只是一般的游戏?你如何让人们在没有端口转发的情况下玩游戏?流程是什么?

现在steam上看到很多游戏都在做,应该不会太复杂吧

可以使用 UPnP 自动配置路由器进行端口转发。 http://pupnp.sourceforge.net/

中有一个库

另一种方法是让一个外部服务器管理所有流量,这样每个人都可以连接到那里,从而避免 nat 问题。

由于这个问题与 Steam 明确相关,我认为值得一提的是 Steamworks API,尤其是 SteamNetworking。它允许通过 Steam 服务器中继点对点连接:

https://partner.steamgames.com/doc/api/ISteamNetworking

bool AllowP2PPacketRelay( bool bAllow );

Allow or disallow P2P connections to fall back to being relayed through the Steam servers if a direct connection or NAT-traversal cannot be established.