public static ServerInfoResult Parse(byte[] data) { var parser = new ResponseParser(data); parser.CurrentPosition += 5; //Header var result = new ServerInfoResult(); result.Protocol = parser.GetByte(); result.Name = parser.GetStringToTermination(); result.Map = parser.GetStringToTermination(); result.Folder = parser.GetStringToTermination(); result.Game = parser.GetStringToTermination(); result.ID = parser.GetShort(); result.Players = parser.GetByte(); result.MaxPlayers = parser.GetByte(); result.Bots = parser.GetByte(); result.ServerType = parser.GetStringOfByte(); result.Environment = parser.GetStringOfByte(); result.Visibility = parser.GetByte(); result.VAC = parser.GetByte(); result.Version = parser.GetStringToTermination(); uint edf = parser.GetByte(); if ((edf & 0x80) != 0) { result.Port = parser.GetShort(); } return(result); }
public async Task <ServerInfoResult> GetServerInfo() { using (var client = new UdpClient(new IPEndPoint(IPAddress.Any, 0))) { client.Connect(EndPoint); var requestPacket = new List <byte>(); requestPacket.AddRange(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }); requestPacket.Add(0x54); requestPacket.AddRange(Encoding.ASCII.GetBytes("Source Engine Query")); requestPacket.Add(0x00); await client.SendAsync(requestPacket.ToArray(), requestPacket.ToArray().Length); var response = Task.Run(() => { var task = client.ReceiveAsync(); task.Wait(TimeoutSettings.ReceiveTimeout); if (task.IsCompleted) { return(task.Result); } throw new QueryTimeoutException($"Query using IP {EndPoint} timed out after {TimeoutSettings.ReceiveTimeout / 1000} seconds."); }); return(ServerInfoResult.Parse(response.Result.Buffer)); } }