因此程序(在两台计算机上)将在每一帧上运行回调(锁定在 60 fps)
public void Update()
{
SteamAPI.RunCallbacks();
}
初始化继电器(程序启动时)
SteamNetworkingUtils.InitRelayNetworkAccess();
创建监听套接字(按下按钮后)
listenSocket = SteamNetworkingSockets.CreateListenSocketP2P(0, 0, null);
并将尝试连接到第二台计算机(按下按钮后)
SteamNetworkingIdentity identityRemote = new SteamNetworkingIdentity();
if (SteamUser.GetSteamID() == new CSteamID(*"mySteamID"*))
identityRemote.SetSteamID64(*"anotherSteamID"*);
else
identityRemote.SetSteamID64(*"mySteamID"*);
connectionSocket = SteamNetworkingSockets.ConnectP2P(ref identityRemote, 0, 0, null);
第二台计算机注意到第一台计算机正在尝试连接到他,它将尝试连接到第一台计算机,并且当连接状态发生变化时,它们将立即接受连接(重复直到状态再次发生变化)
if (connectionState == ESteamNetworkingConnectionState.k_ESteamNetworkingConnectionState_Connecting)
{
SteamNetworkingSockets.AcceptConnection(connectionSocket);
}
但由于某种原因,它们无法连接,一段时间后,ESteamNetworkingConnectionState 将进入 k_ESteamNetworkingConnectionState_ProblemDetectedLocally,据我所知,它超时了
在过去的三天里,我一直在试图找出为什么它们无法相互连接,我已经多次阅读了 Steamworks 的文档,我已经搜索过这个问题,但我还没有看到任何解决方案,我试图通过示例项目看看我做错了什么,但我没有从中得到任何东西,我什至尝试过 Facepunch.Steamworks,但我已经习惯了 Steamworks.NET,以至于 Facepunch.Steamworks 没有任何意义我(当 Steamworks.NET 试图尽可能接近 Steamworks 而 Facepunch.Steamworks 正在从不同的角度做到这一点时,这是有道理的)。
有谁知道我可以做什么来解决这个问题? 我缺少什么吗? 我真的很感激。
PS:如果需要更多代码,我会提供。
我注册只是为了帮助回答你的问题,因为 ISteamNetworkingSockets API 的斗争是真实的,文档很好,但不是很好。
请注意,我使用 Godot 而不是 MonoGame,但 P2P 套接字的实现应该类似。
和你一样,我最初认为主机/服务器创建一个“createListenSocketP2P”,每个对等连接应该使用“connectP2P”。经过大量(真的很多)尝试和错误后,对我有用的是为每个加入的人(包括主持人)创建“createListenSocketP2P”和“connectP2P”。让我更好地解释一下...
所以你的“call_back()”、“InitRelayNetworkAccess()”和“AcceptConnection”设置与我相同。然而,在我的游戏中,我还使用 Steam 的 API 创建多人游戏大厅,当玩家加入大厅时,我有一个按以下顺序使用 Steam API 调用的方法:
connectP2P 应该触发回调(AcceptConnection(connectionSocket)),就像你拥有的那样,它应该根据你的逻辑接受连接。
句柄变量是我捕获的全局变量,因此稍后当我想使用“SendMessageToConnection()”时可以使用它<-- it will want the handle of the user/player you want to send data/msg too.
我希望这对您有帮助,或者至少引导您找到正确的答案。祝你好运。