コード例 #1
0
        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);
        }
コード例 #2
0
        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));
            }
        }