public static RconPacket CreatePacket(int id, RconPacketType type, string body) { var packet = new RconPacket(); packet.ID = id; packet.Type = (int)type; packet.Body = body; return(packet); }
public static RconPacket ParsePacket(byte[] buffer) { if ((PacketMinimumSize <= buffer.Length) && (buffer.Length <= PacketMaximumSize)) { if (buffer[buffer.Length - 1] == 0x00) { using (var ms = new MemoryStream(buffer)) { byte[] bf_size = new byte[4]; byte[] bf_id = new byte[4]; byte[] bf_type = new byte[4]; byte[] bf_body = new byte[buffer.Length - 13]; ms.Read(bf_size, 0, 4); ms.Read(bf_id, 0, 4); ms.Read(bf_type, 0, 4); if (!BitConverter.IsLittleEndian) { Array.Reverse(bf_size); Array.Reverse(bf_id); Array.Reverse(bf_type); } ms.Read(bf_body, 0, buffer.Length - 13); int id = BitConverter.ToInt32(bf_id, 0); int size = BitConverter.ToInt32(bf_size, 0); int type = BitConverter.ToInt32(bf_type, 0); String body = Encoding.ASCII.GetString(bf_body).TrimEnd((char)0); if (size == 10 + body.Length && (type == 0 || type == 2 || type == 5)) { var packet = new RconPacket(); packet.ID = id; packet.Type = type; return(packet); } else { throw new ArgumentException("Invalid Buffer"); } } } else { throw new ArgumentException("Rcon Buffer Must be end with 0x00"); } } else { throw new ArgumentOutOfRangeException("buffer size is not in size range of rcon"); } }
public RconPacket SendPacket(RconPacket packet) { socket.Send(packet.ToArray(), packet.Size, SocketFlags.None); byte[] buffer = new byte[RconPacket.PacketMaximumSize]; int recv; while ((recv = socket.Receive(buffer)) > 0) { return(RconPacket.ParsePacket(buffer)); } return(null); }
public bool Connect(string password, IPEndPoint ip) { if (socket == null) { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ip); var respond = SendPacket(RconPacket.CreatePacket(5653, RconPacketType.SERVERDATA_AUTH, "password")); IsAuthorized = respond.ID != -1; } else if (socket.Connected) { Disconnect(); } return(true); }