コード例 #1
0
        public void OnDataReceived(Socket server, byte[] data, int bytesRead)
        {
            if (_buffer == null)
            {
                if (bytesRead > 1024)
                {
                    _buffer = new byte[bytesRead * 2];
                }
                else
                {
                    _buffer = new byte[1024];
                }
            }
            else if (_buffer.Length < _bufferSize + bytesRead)
            {
                byte[] newBuffer = new byte[(_bufferSize + bytesRead) * 2];

                Array.Copy(_buffer, 0, newBuffer, 0, _bufferSize);
                _buffer = newBuffer;
            }

            Array.Copy(data, 0, _buffer, _bufferSize, bytesRead);
            _bufferSize += bytesRead;

            while (_bufferSize > 3)
            {
                ushort size         = BitConverter.ToUInt16(_buffer, 0);
                ushort opcodeNumber = BitConverter.ToUInt16(_buffer, 2);

                if (!Enum.IsDefined(typeof(ServerOpcode), (ServerOpcode)opcodeNumber))
                {
                    server.Close();
                    return;
                }

                ServerOpcode opcode = (ServerOpcode)opcodeNumber;

                if (_bufferSize >= size + 4)
                {
                    byte[] packet = new byte[size];

                    Array.Copy(_buffer, 4, packet, 0, size);
                    PacketHandler.Handle(opcode, packet);
                    Array.Copy(_buffer, 4 + size, _buffer, 0, _bufferSize - size - 4);
                    _bufferSize -= size + 4;
                }
                else
                {
                    break;
                }
            }
        }
コード例 #2
0
        public static unsafe bool Slice()
        {
            if (m_Server == null)
            {
                Thread.Sleep(1);
                return(true);
            }
            if ((m_LastNetworkActivity.Elapsed && m_Server.Poll(1, SelectMode.SelectRead)) && (m_Server.Available == 0))
            {
                Debug.Trace("Disconnected");
                if (!m_SoftDisconnect)
                {
                    Gumps.MessageBoxOk("Connection lost", true, new OnClick(Engine.DestroyDialogShowAcctLogin_OnClick));
                }
                Disconnect();
                Cursor.Hourglass = false;
                m_SoftDisconnect = false;
                Engine.amMoving  = false;
                return(true);
            }
            if (m_Server.Available > 0)
            {
                if (m_Buffer == null)
                {
                    m_Buffer = new byte[0x10000];
                }
                int num = Read(m_Buffer, m_CurrFilled);
                if (num == -1)
                {
                    return(true);
                }
                m_CurrFilled += num;
                int currFilled = m_CurrFilled;
                int index      = 0;
                while (index < currFilled)
                {
                    byte          num4 = m_Buffer[index];
                    PacketHandler ph   = PacketHandlers.m_Handlers[num4];
                    if (ph == null)
                    {
                        PacketReader.Initialize(m_Buffer, index, m_CurrFilled - index, true, num4, "Unknown").Trace();
                        m_CurrFilled = 0;
                        return(true);
                    }
                    int length = ph.Length;
                    if (length == -1)
                    {
                        if ((currFilled - index) < 3)
                        {
                            break;
                        }
                        length = m_Buffer[index + 2] | (m_Buffer[index + 1] << 8);
                    }
                    if ((currFilled - index) < length)
                    {
                        break;
                    }
                    if (OnRecv != null)
                    {
                        OnRecv(length);
                    }
                    PacketReader pvSrc = PacketReader.Initialize(m_Buffer, index, length, ph.Length != -1, num4, ph.Name);
                    ph.Handle(pvSrc);
                    m_LastNetworkActivity.Reset();
                    if (OnPacketHandle != null)
                    {
                        OnPacketHandle(ph);
                    }
                    index += length;
                    if (m_CurrFilled != currFilled)
                    {
                        return(true);
                    }
                }
                m_CurrFilled -= index;
                if (m_CurrFilled > 0)
                {
                    fixed(byte *numRef = m_Buffer)
                    {
                        byte *numPtr  = numRef;
                        byte *numPtr2 = numRef + index;
                        byte *numPtr3 = numPtr + m_CurrFilled;

                        while (numPtr < numPtr3)
                        {
                            *(numPtr++) = *(numPtr2++);
                        }
                    }
                }
            }
            return(true);
        }