Example #1
0
        private void ProcessLoop(TcpClient src, TcpClient dst, RC4 i, RC4 o, Queue <Tuple <byte, byte[]> > queue, HandlePacket cb)
        {
            try
            {
                var     rdr    = new NReader(src.GetStream());
                NWriter writer = dst == null ? null : new NWriter(dst.GetStream());
                while (true)
                {
                    int    len     = rdr.ReadInt32();
                    byte   id      = rdr.ReadByte();
                    byte[] content = rdr.ReadBytes(len - 5);

                    i.Crypt(content, 0, content.Length);

                    bool send = true;
                    if (id == PacketTable.HELLO)
                    {
                        HelloPacket helloPacket = HelloPacket.Read(new NBufferReader(content));
                        writer  = OnHello(helloPacket);
                        content = NWriter.Write(w => helloPacket.Write(w));
                    }

                    send = cb(ref id, ref content);

                    if (send)
                    {
                        o.Crypt(content, 0, content.Length);

                        writer.Write(content.Length + 5);
                        writer.Write(id);
                        writer.Write(content);
                    }

                    if (queue.Count > 0)
                    {
                        lock (queue)
                        {
                            Tuple <byte, byte[]> packet;
                            while (queue.Count > 0)
                            {
                                packet = queue.Dequeue();
                                o.Crypt(packet.Item2, 0, packet.Item2.Length);

                                writer.Write(packet.Item2.Length + 5);
                                writer.Write(packet.Item1);
                                writer.Write(packet.Item2);
                            }
                        }
                    }
                }
            }
            catch
            {
            }
            finally
            {
                OnDisconnected(src, dst);
            }
            Proxy.Stopped -= Kill;
        }