Exemplo n.º 1
0
        /// <summary>
        ///   Retrieves information about the server
        /// </summary>
        /// <returns>Instance of ServerInfo class</returns>
        protected virtual ServerInfo GetInfoCore()
        {
            var Query = QueryMsg.InfoQuery;

            if (IsObsolete)
            {
                Query = QueryMsg.ObsoleteInfoQuery;
            }


            var sw       = new Stopwatch();
            var recvData = socket.GetResponse(Query, Type, sw);

            Latency = sw.ElapsedMilliseconds;
            try
            {
                switch (recvData[0])
                {
                case 0x49: return(Current(recvData));

                case 0x6D: return(Obsolete(recvData));

                default: throw new InvalidHeaderException("packet header is not valid");
                }
            }
            catch (Exception e)
            {
                e.Data.Add("ReceivedData", recvData);
                throw;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Retrieves information about the server
        /// </summary>
        /// <returns>Instance of ServerInfo class</returns>
        public virtual ServerInfo GetInfo()
        {
            byte[] Query = QueryMsg.InfoQuery;
            if (IsObsolete)
            {
                Query = QueryMsg.ObsoleteInfoQuery;
            }

            byte[]    recvData = new byte[socket.BufferSize];
            Stopwatch sw       = Stopwatch.StartNew();

            recvData = socket.GetResponse(Query, Type);
            sw.Stop();
            Latency = sw.ElapsedMilliseconds;
            try
            {
                switch (recvData[0])
                {
                case 0x49: return(Current(recvData));

                case 0x6D: return(Obsolete(recvData));

                default: throw new InvalidHeaderException("packet header is not valid");
                }
            }
            catch (Exception e)
            {
                e.Data.Add("ReceivedData", recvData);
                throw;
            }
        }
Exemplo n.º 3
0
 internal Server(IPEndPoint address, EngineType type, bool?isObsolete, int sendTimeOut, int receiveTimeOut)
 {
     ServerEndPoint = address;
     Retries        = 3;
     socket         = new UdpQuery(address, sendTimeOut, receiveTimeOut);
     IsDisposed     = false;
     Type           = type;
     if (isObsolete == null)
     {
         try
         {
             if (socket.GetResponse(QueryMsg.ObsoleteInfoQuery, Type)[0] == 0x6D)
             {
                 IsObsolete = true;
             }
         }
         catch (SocketException e)
         {
             if (e.ErrorCode == 10060)
             {
                 IsObsolete = false;
             }
         }
     }
     else
     {
         IsObsolete = isObsolete == true;
     }
 }
Exemplo n.º 4
0
        public override string SendCommand(string command)
        {
            byte[] rconMsg  = Util.MergeByteArrays(RconQuery, Util.StringToBytes(ChallengeId), Util.StringToBytes(" \"" + RConPass + "\" " + command));
            byte[] recvData = new byte[2000];
            string s;

            recvData = socket.GetResponse(rconMsg, EngineType.GoldSource);
            try
            {
                s = Util.BytesToString(recvData).Remove(0, 1);
            }
            catch (Exception e)
            {
                e.Data.Add("ReceivedData", recvData);
                throw;
            }
            return(s);
        }
Exemplo n.º 5
0
        /// <summary>
        ///   Retrieves information about the server
        /// </summary>
        /// <returns>Instance of ServerInfo class</returns>
        protected virtual ServerInfo GetInfoCore(byte[] s2cChallenge = null)
        {
            // in order to prevent reflection/amplification DDoS attacks, Valve decided in Dec 2020 to change the A2S_INFO protocol:
            // https://steamcommunity.com/discussions/forum/14/2974028351344359625/
            // The first request is sent without a challenge, the server may reply with the data directly (as before) or with an S2C_CHALLENGE including a 4 byte challenge.
            // In this case the client resends the A2S_INFO query with the challenge appended
            var Query = QueryMsg.InfoQuery;

            if (IsObsolete)
            {
                Query = QueryMsg.ObsoleteInfoQuery;
            }
            if (s2cChallenge != null)
            {
                Query = new byte[QueryMsg.InfoQuery.Length + 4];
                Array.Copy(QueryMsg.InfoQuery, Query, QueryMsg.InfoQuery.Length);
                Array.Copy(s2cChallenge, 1, Query, QueryMsg.InfoQuery.Length, 4);
            }

            var sw       = new Stopwatch();
            var recvData = socket.GetResponse(Query, Type, sw);

            Latency = sw.ElapsedMilliseconds;
            try
            {
                switch (recvData[0])
                {
                case 0x49: return(DataReceived(recvData));

                case 0x6D: return(Obsolete(recvData));

                case 0x41:
                    if (s2cChallenge == null) // prevent endless loop/recursion
                    {
                        return(ChallengeReceived(recvData));
                    }
                    throw new InvalidHeaderException("A2S_INFO failed after challenge");

                default: throw new InvalidHeaderException("packet header is not valid");
                }
            }
            catch (Exception e)
            {
                e.Data.Add("ReceivedData", recvData);
                throw;
            }
        }
Exemplo n.º 6
0
 internal Server(IPEndPoint address, EngineType type, bool? isObsolete, int sendTimeOut, int receiveTimeOut)
 {
     ServerEndPoint = address;
       Retries = 3;
       socket = new UdpQuery(address, sendTimeOut, receiveTimeOut);
       IsDisposed = false;
       Type = type;
       if (isObsolete == null)
       {
     try
     {
       if (socket.GetResponse(QueryMsg.ObsoleteInfoQuery, Type)[0] == 0x6D)
     IsObsolete = true;
     }
     catch (SocketException e)
     {
       if (e.ErrorCode == 10060)
     IsObsolete = false;
     }
       }
       else
     IsObsolete = isObsolete == true;
 }