예제 #1
0
 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);
 }
예제 #2
0
        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();
        }