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; }