public void SendPacket(InterPacket pPacket, bool crypto = true) { byte[] data = new byte[pPacket.Length + 4]; Buffer.BlockCopy(crypto ? InterCrypto.EncryptData(mIVSend, pPacket.ToArray()) : pPacket.ToArray(), 0, data, 4, pPacket.Length); Buffer.BlockCopy(BitConverter.GetBytes((int)pPacket.Length), 0, data, 0, 4); Send(data); }
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 var packetData = new byte[_mReceivingPacketLength]; Buffer.BlockCopy(_mReceiveBuffer, 0, packetData, 0, _mReceivingPacketLength); if (!_mIVs) { var 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) { var packet = new InterPacket(packetData); 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(); }