SteamnetworkingSockets 不接受连接。 (C#、Steamworks.NET、XNA(单游戏))

问题描述 投票:0回答:1

因此程序(在两台计算机上)将在每一帧上运行回调(锁定在 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:如果需要更多代码,我会提供。

c# networking steamworks-api
1个回答
0
投票

我注册只是为了帮助回答你的问题,因为 ISteamNetworkingSockets API 的斗争是真实的,文档很好,但不是很好。

请注意,我使用 Godot 而不是 MonoGame,但 P2P 套接字的实现应该类似。

和你一样,我最初认为主机/服务器创建一个“createListenSocketP2P”,每个对等连接应该使用“connectP2P”。经过大量(真的很多)尝试和错误后,对我有用的是为每个加入的人(包括主持人)创建“createListenSocketP2P”和“connectP2P”。让我更好地解释一下...

所以你的“call_back()”、“InitRelayNetworkAccess()”和“AcceptConnection”设置与我相同。然而,在我的游戏中,我还使用 Steam 的 API 创建多人游戏大厅,当玩家加入大厅时,我有一个按以下顺序使用 Steam API 调用的方法:

  • createPollGroup() <-- uses for sending and receiving messages among everyone
  • CSteamID(steamID) <-- uses the joining players steam id to set the sockets up
  • createListenSocketP2P(0, []) <-- listen socket
  • 句柄 = connectP2P(p2pName, 0, []) <- connecting socket

connectP2P 应该触发回调(AcceptConnection(connectionSocket)),就像你拥有的那样,它应该根据你的逻辑接受连接。

句柄变量是我捕获的全局变量,因此稍后当我想使用“SendMessageToConnection()”时可以使用它<-- it will want the handle of the user/player you want to send data/msg too.

我希望这对您有帮助,或者至少引导您找到正确的答案。祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.