1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Downloads
  4. Galerie
    1. Alben
  5. Toolbox
    1. Passwort Generator
    2. Portchecker
  6. Mitglieder
    1. Mitgliedersuche
    2. Benutzer online
    3. Trophäen
    4. Team
Fr: 16 Mai 2025
  • Anmelden oder registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Forum
  • Dateien
  • Seiten
  • Bilder
  • Erweiterte Suche

Schön, dass du den Weg zu NodeZone.net gefunden hast! Aktuell bist du nicht angemeldet und kannst deshalb nur eingeschränkt auf unsere Community zugreifen. Um alle Funktionen freizuschalten, spannende Inhalte zu entdecken und dich aktiv einzubringen, registriere dich jetzt kostenlos oder melde dich mit deinem Account an.

Anmelden oder registrieren
    1. Nodezone.net Community
    2. Forum
    3. Entwicklung & Scripting
    4. Programmiersprachen
    5. C/C++

    C# Arma3 Server Information

    • nflug
    • 25. Dezember 2016 um 12:17
    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 12:17
      • #1

      Hey,

      Ich bin gerade dabei einen Launcher zu schreiben für Arma3. Ich hab früher schon einige Programme mit C# geschrieben.
      Nun Suche ich eine Lösung den Motd die Max/Online Players und den Server Status herauszufinden. Ich habe es früher schon einmal hinbekommen nur leider Erfolg ohne das ich diese Informationen Updaten kann.
      Ich habe bereits diese Methoden versucht.

      Spoiler anzeigen
      Code
      https://github.com/PulsarBlow/ArmaServerInfos
      sure if I want credit for this piece of junk =).
      public class ArmA3ServerInfo
          {
              public ServerInfo ServerInfo { get; protected set; }
              public PlayerCollection Players { get; protected set; }
              public string host;
              public int port;
              public long ping;
              public Stopwatch Stopwatch = new Stopwatch();
              public ArmA3ServerInfo(string host, int port)
              {
                  this.host = host;
                  this.port = port;
              }
              public void Update()
              {
                  try
                  {
                      using (UdpClient client = new UdpClient(56800))
                      {
                          Stopwatch.Reset();
                          byte[] request, response;
                          IPEndPoint remoteIpEndpoint = new IPEndPoint(IPAddress.Parse(host), port);
                          client.Client.ReceiveTimeout = 100;
                          client.Connect(remoteIpEndpoint);
                          //Server Info
                          request = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x00 };
                          client.Send(request, request.Length);
                          Stopwatch.Start();
                          response = client.Receive(ref remoteIpEndpoint);
                          Stopwatch.Stop();
                          this.ping = Stopwatch.ElapsedMilliseconds;
                          //string dataServer = Encoding.ASCII.GetString(response).Remove(0, 5);
                          this.ServerInfo = ServerInfo.Parse(response);
                          //request = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x69 };
                          //client.Send(request, request.Length);
                          //response = client.Receive(ref remoteIpEndpoint);
                          //Console.WriteLine(response);
                          //this.ping =
                          //Player Info
                          //request = new byte[] { 0xfe, 0xfd, 0x00, 0x43, 0x4f, 0x52, 0x59, 0x00, 0xff, 0xff };
                          //client.Send(request, request.Length);
                          //response = client.Receive(ref remoteIpEndpoint);
                          //string dataPlayer = Encoding.ASCII.GetString(response).Remove(0, 5);
                          //this.Players = PlayerCollection.Parse(dataPlayer.Remove(0, 32));
                      }
                  }
                  catch (SocketException ex)
                  {
                      if (ex.SocketErrorCode != SocketError.TimedOut)
                      {
                          Console.WriteLine(String.Format(("Socketerror while retrievining server information.", ex));
                      }
                  }
                  catch (Exception ex)
                  {
                      Console.WriteLine(String.Format(("Unknown error while retrievining server information.", ex));
                  }
              }
          }
          public class ServerInfo
          {
              public string GameVersion { get; set; }
              public string HostName { get; set; }
              public string MapName { get; set; }
              public string GameType { get; set; }
              public int NumPlayers { get; set; }
              public int NumTeam { get; set; }
              public int MaxPlayers { get; set; }
              public string GameMode { get; set; }
              public string TimeLimit { get; set; }
              public bool Password { get; set; }
              public string CurrentVersion { get; set; }
              public string RequiredVersion { get; set; }
              public string Mod { get; set; }
              public bool BattleEye { get; set; }
              public double Longitude { get; set; }
              public double Latitude { get; set; }
              public List<string> Players { get; set; }
              public string Mission { get; set; }
              public static ServerInfo Parse(string data)
              {
                  ServerInfo info = new ServerInfo();
                  string[] parts = data.Split('\0');
                  Dictionary<string, string> values = new Dictionary<string, string>();
                  for (int i = 0; i < parts.Length; i++)
                  {
                      if ((i & 1) == 0 && !values.ContainsKey(parts[i]) && (i + 1) < parts.Length)
                          values.Add(parts[i], parts[i + 1]);
                  }
                  info.GameVersion = GetValueByKey("gamever", values);
                  info.HostName = GetValueByKey("hostname", values);
                  info.MapName = GetValueByKey("mapname", values);
                  info.GameType = GetValueByKey("gametype", values);
                  info.NumPlayers = ParseInt(GetValueByKey("numplayers", values));
                  info.NumTeam = ParseInt(GetValueByKey("numteams", values));
                  info.MaxPlayers = ParseInt(GetValueByKey("maxplayers", values));
                  info.GameMode = GetValueByKey("gamemode", values);
                  info.TimeLimit = GetValueByKey("timelimit", values);
                  info.Password = ParseBoolean(GetValueByKey("password", values));
                  info.CurrentVersion = GetValueByKey("currentVersion", values);
                  info.RequiredVersion = GetValueByKey("requiredVersion", values);
                  info.Mod = GetValueByKey("mod", values);
                  info.BattleEye = ParseBoolean(GetValueByKey("sv_battleye", values));
                  info.Longitude = ParseDouble(GetValueByKey("lng", values));
                  info.Latitude = ParseDouble(GetValueByKey("lat", values));
                  info.Mission = GetValueByKey("mission", values);
                  return info;
              }
              internal static ServerInfo Parse(byte[] response)
              {
                  ServerInfo info = new ServerInfo();
                  int pos = 5;
                  info.HostName = GetNextPartString(ref pos, response);
                  info.MapName = GetNextPartString(ref pos, response);
                  info.GameType = GetNextPartString(ref pos, response);
                  info.GameMode = GetNextPartString(ref pos, response);
                  GetNextPart(ref pos, response);//Empty
                  GetNextPart(ref pos, response);//Empty
                  byte[] pInfo = GetNextPart(ref pos, response);
                  if (pInfo.Length > 0)
                  {
                      info.NumPlayers = pInfo[0];
                      info.MaxPlayers = pInfo[1];
                  }
                  else
                  {
                      info.NumPlayers = 0;
                      info.MaxPlayers = GetNextPart(ref pos, response)[0];
                  }
                  GetNextPart(ref pos, response);//Enviroment. dw??
                  GetNextPart(ref pos, response);//Visibility & vac?
                  info.GameVersion = GetNextPartString(ref pos, response);
                  //Extra data flag
                  //for (int i = 0; i < 25; i++)
                  //{
                  //    Console.WriteLine(GetNextPart(ref pos, response));
                  //}
                  return info;
              }
              private static byte[] GetNextPart(ref int pos, byte[] response)
              {
                  byte[] part = new byte[0];
                  for (int i = 0; i <= response.Length; i++)
                  {
                      if(response[i + pos] == 0x0)
                      {
                          pos = i + pos + 1;
                          return part;;
                      }
                      Array.Resize(ref part, part.Length + 1);
                      part[i] = response[i + pos];
                  }
                  return new byte[0];
              }
              private static string GetNextPartString(ref int pos, byte[] response)
              {
                  byte[] val = GetNextPart(ref pos, response);
                  return Encoding.ASCII.GetString(val);
              }
              private static int ParseInt(string value)
              {
                  if (String.IsNullOrWhiteSpace(value))
                      return 0;
                  int parsedValue = 0;
                  Int32.TryParse(value, out parsedValue);
                  return parsedValue;
              }
              private static double ParseDouble(string value)
              {
                  if (String.IsNullOrWhiteSpace(value))
                      return 0;
                  double parsedValue = 0;
                  Double.TryParse(value, out parsedValue);
                  return parsedValue;
              }
              private static bool ParseBoolean(string value)
              {
                  if (String.IsNullOrWhiteSpace(value))
                      return false;
                  if (value == "1" || value.ToLowerInvariant() == "true")
                      return true;
                  return false;
              }
              private static string GetValueByKey(string key, Dictionary<string, string> values)
              {
                  if (values.ContainsKey(key))
                      return values[key];
                  return null;
              }
          }
          public class Player
          {
              public string Name { get; set; }
              public Player()
                  : this(null)
              { }
              public Player(string name)
              {
                  this.Name = name;
              }
          }
          public class PlayerCollection : List<Player>
          {
              public PlayerCollection()
                  : base()
              { }
              public PlayerCollection(IEnumerable<Player> collection)
                  : base(collection)
              { }
              public static PlayerCollection Parse(string data)
              {
                  string final = "";
                  var players = data.Split('\0');
                  int lel = 0;
                  foreach (var p in players)
                  {
                      if (lel == 0)
                      {
                          if (p != "")
                          {
                              final += p + "\0";
                          }
                      }
                      lel++;
                      if (lel == 4)
                          lel = 0;
                  }
                  players = final.Split('\0');
                  PlayerCollection collection = new PlayerCollection(
                      from s in players
                      select new Player(s)
                  );
                  return collection;
              }
          }
      Alles anzeigen

      Leider bekomme ich bei den beiden immer null Error wenn ich die Informationen Abrufe.

      So hab ichs gemacht.

      Code
      GameServer server = new GameServer("127.0.0.1", 2302);
      server.Update();
      
      
      
      
      Label.Text = Server.ServerInfo.MaxPlayers + "";

      Dort bekomme ich dann bei dem (Server.ServerInfo.MaxPlayers) einen null Error.


      Ich habe auch schon herausgefunden wo das Problem genau liegt, Nämlich in der Update() da wo der Server verbindet im Response Teil. Weiß nur nicht genau wie ich das lösen kann. Ich weiß nicht wie Zeit aufwendig es ist diese 3 Infos zu entnehmen aber es wäre nett wenn mir jemand ein bsp schreiben könnte.

      Mit freundlichen Grüßen nflug
      Frohes Neues und schöne Weihnachten. santa

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • Moritz
      Fortgeschrittener
      Reaktionen
      180
      Trophäen
      10
      Beiträge
      314
      • 25. Dezember 2016 um 12:45
      • #2

      Die einfachste lösung wäre doch z.B den Gametracker zu nutzen oder nicht?

      Terrainbuilder Grund Guide: Terrainbuilder Grund Guide
      Mapping Service :) Mapping Service
      Ich streame Täglich ab 14 Uhr! Twitch

    • blackfisch
      Legende
      Reaktionen
      2.944
      Trophäen
      9
      Beiträge
      5.966
      Dateien
      6
      Bilder
      63
      • 25. Dezember 2016 um 15:19
      • #3

      Nen Gametracker in eine C# Anwendung einzubinden wäre machbar, ist aber auch nicht die schönste und beste Art @Moritz

      @Flyyying_nflug Laut Game Tracker API? or Plugin? :: GameTracker Forum kann man sich wohl das ganze per XML Feed ausgeben lassen und den könntest du doch theoretisch alle X Minuten abfragen und die werte auslesen lassen

      #MakeArmaNotWar

      Kein Support via PN & Steam! / No Support via DM & Steam!


      Mit freundlichen Grüßen
      blackfisch
      ______________________

      Web: blackfisch.me

      GitHub: GitHub.com/blackfisch

      Mail: [email protected]

      ______________________
      Wichtige Links:
      [Erklärung|Leitfaden] Code Optimierung

      [Tutorial] life_fnc_MP zu remoteExec

      Ohne Logs & entsprechende Dateien kein Support!

      ______________________

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 17:57
      • #4

      Danke für die Antworten. Aber die Daten wollte ich lieber irgendwie über die Steam Query bekommen da GameTracker auch manchmal seine Tage hat. Was auch direkt besser wäre weil ich dann die Steam ID hätte mit der der Spieler sein Arma3 startet.

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 17:59
      • #5

      Vlt weiß @Pac ja was :D

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • The C Stands for Cheese
      Gast
      • 25. Dezember 2016 um 18:04
      • #6
      Zitat von Flyyying_nflug

      Vlt weiß @Pac ja was :D

      Ich schreib dich mal per PN an. Lösung kannst du dann ggf. selber Posten ;)

    • OPTiX
      Anfänger
      Reaktionen
      95
      Trophäen
      11
      Beiträge
      71
      • 25. Dezember 2016 um 18:16
      • #7

      Das Protokol der Server Queries kannst du hier nachlesen:
      Server queries - Valve Developer Community

      Selbst einbinden muss man aber nicht umbedingt, dafür gibt es zahlreiche Libraries wie
      QueryMaster - Home


      oder etwas älter, funktioniert aber noch
      Seth Lunsford / ssqlib · GitLab

    • Panthor Life
      Fortgeschrittener
      Reaktionen
      190
      Trophäen
      9
      Beiträge
      167
      Bilder
      51
      • 25. Dezember 2016 um 20:06
      • #8

      Ich würde eher auf ein Web Backend setzen das dir die Daten gecached liefert.
      Ich weiß nicht für was für eine Menge Traffic SourceQuery konzipiert ist.

      Wird der Launcher Opensource ?

      Einer von diesen Arma 3 Servern. https://panthor.de/

    • OPTiX
      Anfänger
      Reaktionen
      95
      Trophäen
      11
      Beiträge
      71
      • 25. Dezember 2016 um 20:59
      • #9
      Zitat von Greeny

      Ich würde eher auf ein Web Backend setzen das dir die Daten gecached liefert.
      Ich weiß nicht für was für eine Menge Traffic SourceQuery konzipiert ist.

      Wird der Launcher Opensource ?

      Das SourceQuery Protokoll wird direkt vom Gameserver verwaltet und wird von Steam verwendet um Spielinformationen anzuzeigen. Wenn er Daten gecached anzeigen möchte, würde ich trotzdem SourceQuery nutzen, diese aber mit einem WebSocket auf der Servermaschine anbieten. Dann kann er selbst entscheiden, was er cached und was nicht.

    • Panthor Life
      Fortgeschrittener
      Reaktionen
      190
      Trophäen
      9
      Beiträge
      167
      Bilder
      51
      • 25. Dezember 2016 um 21:49
      • #10

      Für Onlinestatus von Spielern würde ich eher rcon benutzen.

      Einer von diesen Arma 3 Servern. https://panthor.de/

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 21:57
      • #11
      Zitat von Greeny

      Für Onlinestatus von Spielern würde ich eher rcon benutzen.


      Die Informationen die Ich haben will:

      Server Online?
      Wie viele Spieler?
      Name/Motd?

      SteamID des Spielers im Launcher (Mit Steam Login)?

      Dafür wäre mir RCON zu unsicher und würde ich für das Projekt auch nicht bereitgestellt bekommen. Es gibt bestimmt eine andere Lösung mit NuGets

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • Panthor Life
      Fortgeschrittener
      Reaktionen
      190
      Trophäen
      9
      Beiträge
      167
      Bilder
      51
      • 25. Dezember 2016 um 22:04
      • #12

      SourceQuery hat keinerlei unique key für die Spieler (Nur Namen)

      Wenn du irgendeine Form von Steam Login haben willst wirst du an einem webbackend nicht vorbeikommen da du dafür OpenID benutzen musst.

      Einer von diesen Arma 3 Servern. https://panthor.de/

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 22:08
      • #13
      Zitat von Greeny

      SourceQuery hat keinerlei unique key für die Spieler (Nur Namen)

      Wenn du irgendeine Form von Steam Login haben willst wirst du an einem webbackend nicht vorbeikommen da du dafür OpenID benutzen musst.

      Wäre es nicht möglich diese ganzen Informationen von dem offenen Steam zu bekommen?

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • Panthor Life
      Fortgeschrittener
      Reaktionen
      190
      Trophäen
      9
      Beiträge
      167
      Bilder
      51
      • 25. Dezember 2016 um 22:10
      • #14

      offenen Steam ?

      Einer von diesen Arma 3 Servern. https://panthor.de/

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 22:11
      • #15

      Steam.exe

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • Panthor Life
      Fortgeschrittener
      Reaktionen
      190
      Trophäen
      9
      Beiträge
      167
      Bilder
      51
      • 25. Dezember 2016 um 22:22
      • #16

      Du kannst dir halt mal anschauen wie das über Steamworks geht aber da habe ich keinen Plan, sorry.

      Ich benutze einfach ein secret mit einer RestAPI, das secret können sich die Spieler auf meinem webpanel holen oder für unsere app als qr code scannen

      Einer von diesen Arma 3 Servern. https://panthor.de/

    • Jonas
      Anfänger
      Reaktionen
      10
      Trophäen
      11
      Beiträge
      51
      Bilder
      5
      • 25. Dezember 2016 um 23:07
      • #17

      Eine API von Bohemia: https://units.arma3.com/resource/server?ip_address=37.187.163.189&port=2302

      Ps. musst die Seite nur zwei mal laden

      Lg

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 25. Dezember 2016 um 23:15
      • #18
      Zitat von Jonas

      Eine API von Bohemia: https://units.arma3.com/resource/server?ip_address=37.187.163.189&port=2302

      Ps. musst die Seite nur zwei mal laden

      Lg

      Vielen Dank erstmal.
      Weiß du auch wie ich darauf zugreife?
      Ich meine das ist ja kein Dokument.

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    • Jonas
      Anfänger
      Reaktionen
      10
      Trophäen
      11
      Beiträge
      51
      Bilder
      5
      • 25. Dezember 2016 um 23:21
      • #19

      Hab noch nicht damit gearbeitet, aber beim zweiten laden kommt das als json string raus: {"status":true,"description":"ZoGGaZ_Altis_Life","players":18,"max_players":100,"dedicated":true,"password":false,"game_version":"1.66.139494","game_port":2302,"map":"Altis","name":"[GER] A3ZL Modded RP Server|www.ZoGGaZ.de"}

    • nflug
      Nerd
      Reaktionen
      225
      Trophäen
      9
      Beiträge
      781
      • 26. Dezember 2016 um 02:12
      • #20
      Zitat von Jonas

      Hab noch nicht damit gearbeitet, aber beim zweiten laden kommt das als json string raus: {"status":true,"description":"ZoGGaZ_Altis_Life","players":18,"max_players":100,"dedicated":true,"password":false,"game_version":"1.66.139494","game_port":2302,"map":"Altis","name":"[GER] A3ZL Modded RP Server|www.ZoGGaZ.de"}

      Danke Problem hat sich geregelt.
      Lösung: QueryMaster - Home
      Vielen Dank nochmal an die Hilfe von @Pac

      #MAKE_ARMA_NOT_WAR

      ⥴ Scripts made with love

      Why do programmers work in dark rooms?

      Because light attracts bugs...

    Registrieren oder Einloggen

    Du bist noch kein Mitglied von Native-Servers.com? Registriere dich kostenlos und werde Teil einer großartigen Community!

    Benutzerkonto erstellen

    Ähnliche Themen

    • Ownership issues found @extDB2

      • Grobyg
      • 1. März 2017 um 00:38
      • Hilfeforum
    • I would like to ask my arma3 live RPG server house items can not be stored

      • maosheng
      • 18. Februar 2017 um 16:41
      • Hilfeforum

    Benutzer online in diesem Thema

    • 1 Besucher

    Wichtige Links & Informationen

    Server & Hosting-Ressourcen

      Server Administration & Hosting Basics

      Windows Server Support & Guides

      Linux Server Configuration & Help

      Setting up TeamSpeak 3 & VoIP Servers

      Domains & Web Hosting for Beginners & Professionals

      Cloud Hosting, Docker & Kubernetes Tutorials

    Gameserver & Modding-Ressourcen

      ArmA 3 Tutorials & Script Collection

      Renting & Operating Gameservers

      DayZ Server Management & Help

      FiveM (GTA V) Server & Script Development

      Rust Server Modding & Administration

      Setting up & Optimizing ARK Survival Servers

    NodeZone.net – Deine Community für Gameserver, Server-Hosting & Modding

      NodeZone.net ist dein Forum für Gameserver-Hosting, Rootserver, vServer, Webhosting und Modding. Seit 2015 bietet unsere Community eine zentrale Anlaufstelle für Server-Admins, Gamer und Technikbegeisterte, die sich über Server-Management, Hosting-Lösungen und Spielemodding austauschen möchten.


      Ob Anleitungen für eigene Gameserver, Hilfe bei Root- und vServer-Konfigurationen oder Tipps zu Modding & Scripting – bei uns findest du fundiertes Wissen und praxisnahe Tutorials. Mit einer stetig wachsenden Community findest du hier Antworten auf deine Fragen, Projektpartner und Gleichgesinnte für deine Gaming- und Serverprojekte. Schließe dich NodeZone.net an und werde Teil einer aktiven Community rund um Server-Hosting, Gameserver-Management und Modding-Ressourcen.

    Wer jetzt nicht teilt ist selber Schuld:
    1. Nutzungsbestimmungen
    2. Verhaltensregeln
    3. Datenschutzerklärung
    4. Impressum
    5. Urheberrechts- oder Lizenzverstoß melden
  • Trimax Design coded & layout by Gino Zantarelli 2023-2025©
    Community-Software: WoltLab Suite™