internal void Connect()
        {
            Stealth.AddTraceMessage(string.Format("Connect Stealth client. Host: {0}, Port: {1}", _host, _port),
                                    "Stealth.Network");
            _client = new TcpClient(_host, _port);
            _reader = new BinaryReader(_client.GetStream());
            _writer = new BinaryWriter(_client.GetStream());

            Stealth.AddTraceMessage("Start reciever", "Stealth.Network");
            var factory = new TaskFactory(_cts.Token, TaskCreationOptions.LongRunning,
                                          TaskContinuationOptions.LongRunning, TaskScheduler.Default);

            factory.StartNew(Receiver, _cts.Token);
        }
        private void SendPacket(Packet packet)
        {
            while (_writer == null || !_writer.BaseStream.CanWrite)
            {
                Thread.Sleep(10);
            }

            if (Stealth.EnableTracing)
            {
                Stealth.AddTraceMessage(string.Format("Send packet. Type: {0}, Param: {1}",
                                                      packet.Method,
                                                      string.Join(",", packet.Data.Select(b => b.ToString("X2")))),
                                        "Stealth.Network");
            }
            var pb = packet.GetBytes();
            var lb = BitConverter.GetBytes(pb.Length).Reverse().ToArray();

            _writer.Write(lb);
            _writer.Write(pb);
            _writer.Flush();
        }
        private void Receiver(object state)
        {
            var token = (CancellationToken)state;

            while (!token.IsCancellationRequested)
            {
                if (_reader != null && _reader.BaseStream.CanRead && ((NetworkStream)_reader.BaseStream).DataAvailable)
                {
                    while (((NetworkStream)_reader.BaseStream).DataAvailable)
                    {
                        var packetLen = BitConverter.ToUInt32(_reader.ReadBytes(4), 0);

                        var packet = new Packet();
                        packet.Method     = (PacketType)_reader.ReadUInt16();
                        packet.DataLength = _reader.ReadInt16();
                        packet.Data       = _reader.ReadBytes(packet.DataLength);

                        if (Stealth.EnableTracing)
                        {
                            Stealth.AddTraceMessage(string.Format("Read packet. Type: {0}, Param: {1}",
                                                                  packet.Method,
                                                                  string.Join(",", packet.Data.Select(b => b.ToString("X2")))),
                                                    "Stealth.Network");
                        }

                        ProcessPacket(packet);
                    }
                }
                else
                {
                    Thread.Sleep(10);
                }
            }

            token.ThrowIfCancellationRequested();
        }