/// <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; } }
/// <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; } }
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; } }
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); }
/// <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; } }
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; }