Esempio n. 1
0
        private void EndReceive(IAsyncResult ar)
        {
            if (!Connected)
            {
                return;
            }
            int recvLen = 0;

            try {
                recvLen = _socket.EndReceive(ar);
            } catch {
                ForceDisconnect();
                return;
            }
            if (recvLen <= 0)
            {
                ForceDisconnect();
                return;
            }
            Append(mSharedBuffer, 0, recvLen);

            while (true)
            {
                if (mCursor < 4)
                {
                    break;
                }

                ushort packetSize = MapleCrypto.getPacketLength(mBuffer, 0);
                if (mCursor < (packetSize + 4))
                {
                    break;
                }
                byte[] packetBuffer = new byte[packetSize];
                Buffer.BlockCopy(mBuffer, 4, packetBuffer, 0, packetSize);
                RIV.Decrypt(packetBuffer);
                mCursor -= (packetSize + 4);
                if (mCursor > 0)
                {
                    Buffer.BlockCopy(mBuffer, packetSize + 4, mBuffer, 0, mCursor);
                }
                if (OnPacketReceived != null)
                {
                    if (!Connected)
                    {
                        return;
                    }
                    OnPacketReceived(packetBuffer);
                }
            }
            BeginReceive();
        }
Esempio n. 2
0
        /// <summary>
        /// Data received event handler
        /// </summary>
        /// <param name="iar">IAsyncResult of the data received event</param>
        private void OnDataReceived(IAsyncResult iar)
        {
            var socketInfo = (SocketInfo)iar.AsyncState;

            try
            {
                var received = socketInfo.Socket.EndReceive(iar);
                if (received == 0)
                {
                    OnClientDisconnected?.Invoke(this);
                    return;
                }

                socketInfo.Index += received;

                if (socketInfo.Index == socketInfo.DataBuffer.Length)
                {
                    switch (socketInfo.State)
                    {
                    case SocketInfo.StateEnum.Header:
                        if (socketInfo.IsNoEncryption)
                        {
                            var headerReader = new PacketReader(socketInfo.DataBuffer);
                            var packetHeader = headerReader.ReadShort();
                            socketInfo.State      = SocketInfo.StateEnum.Content;
                            socketInfo.DataBuffer = new byte[packetHeader];
                            socketInfo.Index      = 0;
                            WaitForData(socketInfo);
                        }
                        else
                        {
                            var headerReader  = new PacketReader(socketInfo.DataBuffer);
                            var packetHeaderB = headerReader.ToArray();
                            var packetHeader  = headerReader.ReadInt();
                            var packetLength  = (short)MapleCrypto.GetPacketLength(packetHeader);
                            if (Type == SessionType.SERVER_TO_CLIENT &&
                                !RIV.CheckPacketToServer(BitConverter.GetBytes(packetHeader)))
                            {
                                Log.LogError("Packet check failed. Disconnecting client");
                                Socket.Close();
                            }

                            socketInfo.State      = SocketInfo.StateEnum.Content;
                            socketInfo.DataBuffer = new byte[packetLength];
                            socketInfo.Index      = 0;
                            WaitForData(socketInfo);
                        }

                        break;

                    case SocketInfo.StateEnum.Content:
                        var data = socketInfo.DataBuffer;

                        if (socketInfo.IsNoEncryption)
                        {
                            socketInfo.IsNoEncryption = false;
                            var reader  = new PacketReader(data);
                            var version = reader.ReadShort();
                            var unknown = reader.ReadMapleString();
                            SIV = new MapleCrypto(reader.ReadBytes(4), version);
                            RIV = new MapleCrypto(reader.ReadBytes(4), version);
                            var serverType = reader.ReadByte();

                            if (Type == SessionType.CLIENT_TO_SERVER)
                            {
                                OnInitPacketReceived(version, serverType);
                            }

                            OnPacketReceived(new PacketReader(data), true);
                            WaitForData();
                        }
                        else
                        {
                            RIV.Crypt(data);
                            MapleCustomEncryption.Decrypt(data);

                            if (data.Length != 0)
                            {
                                OnPacketReceived?.Invoke(new PacketReader(data), false);
                            }

                            WaitForData();
                        }

                        break;
                    }
                }
                else
                {
                    Log.LogWarning("Not enough data");
                    WaitForData(socketInfo);
                }
            }
            catch (ObjectDisposedException e)
            {
                Log.LogError("Socket has been closed", e);
            }
            catch (SocketException se)
            {
                if (se.ErrorCode != 10054)
                {
                    Log.LogError("Session.OnDataReceived", se);
                }
            }
            catch (Exception e)
            {
                Log.LogError("Session.OnDataReceived", e);
            }
        }
Esempio n. 3
0
        private void EndReceive(IAsyncResult ar)
        {
            if (!Connected)
            {
                return;
            }

            var recvLen = 0;

            try
            {
                recvLen = Socket.EndReceive(ar);
            }

            catch
            {
                ForceDisconnect();
                return;
            }

            if (recvLen <= 0)
            {
                ForceDisconnect();
                return;
            }

            Append(_mSharedBuffer, 0, recvLen);

            while (true)
            {
                if (_mCursor < 4)
                {
                    break;
                }

                var packetSize = MapleCrypto.getPacketLength(_mBuffer, 0);

                if (_mCursor < packetSize + 4)
                {
                    break;
                }

                var packetBuffer = new byte[packetSize];
                Buffer.BlockCopy(_mBuffer, 4, packetBuffer, 0, packetSize);
                RIV.Transform(packetBuffer);
                _mCursor -= (packetSize + 4);

                if (_mCursor > 0)
                {
                    Buffer.BlockCopy(_mBuffer, packetSize + 4, _mBuffer, 0, _mCursor);
                }

                if (OnPacketReceived != null)
                {
                    if (!Connected)
                    {
                        return;
                    }
                    OnPacketReceived(packetBuffer);
                }
            }

            BeginReceive();
        }