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; } } }
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); }