Ejemplo n.º 1
0
        public Task StartClientAsync()
        {
            Task.Factory.StartNew(async() =>
            {
                while (Socket.Connected)
                {
                    var packetSize = BitConverter.ToInt32(await ReceiveBytesAsync(4));
                    var packetData = await ReceiveBytesAsync(packetSize);
                    var packet     = Activator.CreateInstance(typeof(RconResultPacket), packetData) as RconResultPacket;

                    packet.Deserialize();

                    lock (_lockObj)
                    {
                        if (QueuedCommandPackets.ContainsKey(packet.PacketId))
                        {
                            QueuedCommandPackets[packet.PacketId] = packet;
                        }
                        else
                        {
                            QueuedPackets.Add(packet);
                        }
                    }
                }
            });

            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        public async Task <TPacket> ReceivePacketAsync <TPacket>(int expectedPacketId = -1)
            where TPacket : RconPacket
        {
            RconResultPacket packet = null;

            await Task.Run(() =>
            {
                while (packet == null)
                {
                    lock (_lockObj)
                    {
                        if (expectedPacketId != -1)
                        {
                            packet = QueuedCommandPackets.FirstOrDefault(x => x.Value != null && x.Value.PacketId == expectedPacketId).Value;
                        }
                        else
                        {
                            packet = QueuedPackets.FirstOrDefault();
                        }
                    }
                }
            });

            if (packet == null)
            {
                return(null);
            }

            lock (_lockObj)
            {
                if (packet != null)
                {
                    if (QueuedCommandPackets.ContainsKey(packet.PacketId))
                    {
                        QueuedCommandPackets.Remove(packet.PacketId, out var p);
                    }
                    else
                    {
                        QueuedPackets.Remove(packet);
                    }
                }
            }

            var tPacket = Activator.CreateInstance(typeof(TPacket), packet.Buffer) as TPacket;

            tPacket.Deserialize();

            return(tPacket);
        }