コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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();
            }
        }