private void EndReceive(object sender, SocketAsyncEventArgs pArguments) { if (mDisconnected != 0) return; if (pArguments.BytesTransferred <= 0) { Disconnect(); return; } mReceiveLength += pArguments.BytesTransferred; if (mReceivingPacketLength == mReceiveLength) { if (mHeader) //parse headers { mReceivingPacketLength = BitConverter.ToInt32(mReceiveBuffer, 0); mReceiveLength = 0; mReceiveStart = 0; mHeader = false; // mReceiveBuffer = new byte[mReceivingPacketLength]; } else { //parse packets byte[] packetData = new byte[mReceivingPacketLength]; Buffer.BlockCopy(mReceiveBuffer, 0, packetData, 0, mReceivingPacketLength); if (!mIVs) { InterPacket packet = new InterPacket(packetData); if (packet.OpCode == InterHeader.IVS) { Log.WriteLine(LogLevel.Info, "IV data received"); packet.ReadBytes(mIVRecv); mIVs = true; } else { Log.WriteLine(LogLevel.Info, "Got wrong packet."); Disconnect(); } } else { packetData = InterCrypto.DecryptData(mIVRecv, packetData); if (OnPacket != null) { InterPacket packet = new InterPacket(packetData); this.OnPacket(this, new InterPacketReceivedEventArgs(packet, this)); } } //we reset this packet mReceivingPacketLength = 4; mReceiveLength = 0; mReceiveStart = 0; mHeader = true; // mReceiveBuffer = new byte[4]; } } else { mReceiveStart += mReceivingPacketLength; } BeginReceive(); pArguments.Dispose(); }