private void ReadCallback(IAsyncResult ar) { CustomBuffer cb = (ar.AsyncState as (NetworkStream _ns, CustomBuffer _cb)? ?? (null, null))._cb; NetworkStream ns = (ar.AsyncState as (NetworkStream _ns, CustomBuffer _cb)? ?? (null, null))._ns; bool isClient = ns == _clientStream; RC4 currCipher = isClient ? _clientRecvCipher : _serverRecvCipher; if (!ns.CanRead) { return; } int read = ns.EndRead(ar); cb.Walk(read); if (read == 0) { Dispose(); } else if (cb.Idx == 4) { cb.ResizeBuffer(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(cb.Buffer, 0))); Read(cb.Idx, cb.Remaining, isClient); } else if (cb.Remaining > 0) { Read(cb.Idx, cb.Remaining, isClient); } else { currCipher.Cipher(cb.Buffer); ConsoleUtilities.VerboseWriteLine("Received Data! Size: " + cb.Buffer.Length); Packet p = Packet.Construct(cb.Buffer); ConsoleUtilities.VerboseWriteLine("Received Data is a " + p.Type + " packet!"); if (isClient) { _proxy.ClientPacketSent(this, p); } else { _proxy.ServerPacketSent(this, p); } if (p.Send) { Send(p, !isClient); } cb.Clear(); Read(0, 4, isClient); } }
private void Read(int offset, int count, bool isClient) { CustomBuffer cb = isClient ? _clientBuffer : _serverBuffer; NetworkStream ns = isClient ? _clientStream : _serverStream; try { ns.BeginRead(cb.Buffer, offset, count, ReadCallback, (ns, cb)); } catch (Exception ex) { Console.WriteLine(ex.Message); Dispose(); } }