Example #1
0
        private string sendCommand(string command, bool isMultipacketResponse)
        {
            RconSrcPacket senPacket = new RconSrcPacket()
            {
                Body = command, Id = (int)PacketId.ExecCmd, Type = (int)PacketType.Exec
            };
            List <byte[]> recvData = socket.GetMultiPacketResponse(RconUtil.GetBytes(senPacket));
            StringBuilder str      = new StringBuilder();

            try
            {
                for (int i = 0; i < recvData.Count; i++)
                {
                    //consecutive rcon command replies start with an empty packet
                    if (BitConverter.ToInt32(recvData[i], 4) == (int)PacketId.Empty)
                    {
                        continue;
                    }
                    if (recvData[i].Length - BitConverter.ToInt32(recvData[i], 0) == 4)
                    {
                        str.Append(RconUtil.ProcessPacket(recvData[i]).Body);
                    }
                    else
                    {
                        str.Append(RconUtil.ProcessPacket(recvData[i]).Body + Util.BytesToString(recvData[++i].Take(recvData[i].Length - 2).ToArray()));
                    }
                }
            }
            catch (Exception e)
            {
                e.Data.Add("ReceivedData", recvData.SelectMany(x => x).ToArray());
                throw;
            }
            return(str.ToString());
        }
Example #2
0
        internal async Task <RconSrcPacket> GetResponseAsync(RconSrcPacket senPacket)
        {
            if (_procTask == null)
            {
                throw new QueryMasterException($"{nameof(TcpQuery)} must be initialized before calling {nameof(GetResponseAsync)}");
            }
            if (_procTask.IsCompleted)
            {
                throw new QueryMasterException("Receive thread is in a failed state");
            }

            var tcs     = new TaskCompletionSource <RconSrcPacket>();
            var handler = new OnPacketEventHandler((data, exception) =>
            {
                if (data != null)
                {
                    var packet = RconUtil.ProcessPacket(data);
                    if (packet.Id == senPacket.Id)
                    {
                        tcs.SetResult(packet);
                    }
                }

                if (exception != null)
                {
                    tcs.SetException(exception);
                }
            });

            try
            {
                await _ss.WaitAsync();

                OnPacket += handler;
                try
                {
                    SendData(RconUtil.GetBytes(senPacket));
                }
                catch (Exception ex) { throw new QueryMasterException("Failed to send packet", ex); }

                if (await Task.WhenAny(tcs.Task, Task.Delay(_conInfo.ReceiveTimeout)) == tcs.Task)
                {
                    return(tcs.Task.Result);
                }
                else
                {
                    return(null);
                }
            }
            finally
            {
                OnPacket -= handler;
                _ss.Release();
            }
        }
Example #3
0
        private string sendCommand(string command, bool isMultipacketResponse)
        {
            RconSrcPacket senPacket = new RconSrcPacket()
            {
                Body = command, Id = (int)PacketId.ExecCmd, Type = (int)PacketType.Exec
            };
            List <byte[]> recvData    = socket.GetMultiPacketResponse(RconUtil.GetBytes(senPacket));
            StringBuilder str         = new StringBuilder();
            bool          lastPacket  = false;
            bool          firstPacket = false;

            try
            {
                for (int i = 0; i < recvData.Count; i++)
                {
                    if (BitConverter.ToInt32(recvData[i], 4) == (int)PacketId.Empty)
                    {
                        continue;
                    }
                    if (recvData[i].Length - BitConverter.ToInt32(recvData[i], 0) == 4)
                    {
                        str.Append(RconUtil.ProcessPacket(recvData[i]).Body);
                    }
                    else
                    {
                        lastPacket  = (i == recvData.Count - 1);
                        firstPacket = i == 0;
                        str.Append(RconUtil.ProcessPacket(recvData[i], firstPacket, lastPacket).Body);
                    }
                }
            }
            catch (Exception e)
            {
                e.Data.Add("ReceivedData", recvData.SelectMany(x => x).ToArray());
                throw;
            }
            return(str.ToString());
        }