/// <summary> /// Called when the client receives bytes /// </summary> /// <param name="numBytes">The number of bytes received</param> public void ReceiveBytes(int numBytes) { lock (m_SyncLock) { byte[] buffer = m_client.ReceiveBuffer; //End Offset of buffer int bufferSize = m_client.ReceiveBufferOffset + numBytes; //Size < minimum if (bufferSize < GSPacketIn.HDR_SIZE) { m_client.ReceiveBufferOffset = bufferSize; // undo buffer read return; } //Reset the offset m_client.ReceiveBufferOffset = 0; //Current offset into the buffer int curOffset = 0; do { int packetLength = (buffer[curOffset] << 8) + buffer[curOffset + 1] + GSPacketIn.HDR_SIZE; int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength) { Buffer.BlockCopy(buffer, curOffset, buffer, 0, dataLeft); m_client.ReceiveBufferOffset = dataLeft; break; } // ** commented out because this hasn't been used in forever and crutching // ** to it only hurts performance in a design that needs to be reworked // ** anyways. // ** - tobz //var curPacket = new byte[packetLength]; //Buffer.BlockCopy(buffer, curOffset, curPacket, 0, packetLength); //curPacket = m_encoding.DecryptPacket(buffer, false); int packetEnd = curOffset + packetLength; int calcCheck = CalculateChecksum(buffer, curOffset, packetLength - 2); int pakCheck = (buffer[packetEnd - 2] << 8) | (buffer[packetEnd - 1]); if (pakCheck != calcCheck) { if (log.IsWarnEnabled) log.WarnFormat( "Bad TCP packet checksum (packet:0x{0:X4} calculated:0x{1:X4}) -> disconnecting\nclient: {2}\ncurOffset={3}; packetLength={4}", pakCheck, calcCheck, m_client.ToString(), curOffset, packetLength); if (log.IsInfoEnabled) { log.Info("Last client sent/received packets (from older to newer):"); foreach (IPacket prevPak in GetLastPackets()) { log.Info(prevPak.ToHumanReadable()); } log.Info(Marshal.ToHexDump("Last Received Bytes : ", buffer)); } m_client.Disconnect(); return; } var pak = new GSPacketIn(packetLength - GSPacketIn.HDR_SIZE); pak.Load(buffer, curOffset, packetLength); try { HandlePacket(pak); } catch (Exception e) { if (log.IsErrorEnabled) log.Error("HandlePacket(pak)", e); } curOffset += packetLength; } while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; m_client.ReceiveBufferOffset = 1; } } }
/// <summary> /// Called when the client receives bytes /// </summary> /// <param name="numBytes">The number of bytes received</param> public void ReceiveBytes(int numBytes) { lock (m_SyncLock) { byte[] buffer = m_client.ReceiveBuffer; //End Offset of buffer int bufferSize = m_client.ReceiveBufferOffset + numBytes; //Size < minimum if (bufferSize < GSPacketIn.HDR_SIZE) { m_client.ReceiveBufferOffset = bufferSize; // undo buffer read return; } //Reset the offset m_client.ReceiveBufferOffset = 0; //Current offset into the buffer int curOffset = 0; do { int packetLength = (buffer[curOffset] << 8) + buffer[curOffset + 1] + GSPacketIn.HDR_SIZE; int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength) { Buffer.BlockCopy(buffer, curOffset, buffer, 0, dataLeft); m_client.ReceiveBufferOffset = dataLeft; break; } m_encoding.DecryptPacket(buffer, curOffset, false); // decrypt inplace int packetEnd = curOffset + packetLength; int calcCheck = CalculateChecksum(buffer, curOffset, packetLength - 2); int pakCheck = (buffer[packetEnd - 2] << 8) | (buffer[packetEnd - 1]); if (pakCheck != calcCheck) { if (log.IsWarnEnabled) log.WarnFormat( "Bad TCP packet checksum (packet:0x{0:X4} calculated:0x{1:X4}) -> disconnecting\nclient: {2}\ncurOffset={3}; packetLength={4}", pakCheck, calcCheck, m_client.ToString(), curOffset, packetLength); if (log.IsInfoEnabled) { log.Info("Last client sent/received packets (from older to newer):"); foreach (IPacket prevPak in GetLastPackets()) { log.Info(prevPak.ToHumanReadable()); } log.Info(Marshal.ToHexDump("Last Received Bytes : ", buffer)); } m_client.Disconnect(); return; } var pak = new GSPacketIn(packetLength - GSPacketIn.HDR_SIZE); pak.Load(buffer, curOffset, packetLength); try { HandlePacket(pak); } catch (Exception e) { if (log.IsErrorEnabled) log.Error("HandlePacket(pak)", e); } curOffset += packetLength; } while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; m_client.ReceiveBufferOffset = 1; } } }
/// <summary> /// Called when the client receives bytes /// </summary> /// <param name="numBytes">The number of bytes received</param> public void ReceiveBytes(int numBytes) { lock (_syncLock) { byte[] buffer = _client.ReceiveBuffer; // End Offset of buffer int bufferSize = _client.ReceiveBufferOffset + numBytes; // Size < minimum if (bufferSize < GSPacketIn.HDR_SIZE) { _client.ReceiveBufferOffset = bufferSize; // undo buffer read return; } // Reset the offset _client.ReceiveBufferOffset = 0; // Current offset into the buffer int curOffset = 0; do { int packetLength = (buffer[curOffset] << 8) + buffer[curOffset + 1] + GSPacketIn.HDR_SIZE; int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength) { Buffer.BlockCopy(buffer, curOffset, buffer, 0, dataLeft); _client.ReceiveBufferOffset = dataLeft; break; } // ** commented out because this hasn't been used in forever and crutching // ** to it only hurts performance in a design that needs to be reworked // ** anyways. // ** - tobz // var curPacket = new byte[packetLength]; // Buffer.BlockCopy(buffer, curOffset, curPacket, 0, packetLength); // curPacket = m_encoding.DecryptPacket(buffer, false); int packetEnd = curOffset + packetLength; int calcCheck = CalculateChecksum(buffer, curOffset, packetLength - 2); int pakCheck = (buffer[packetEnd - 2] << 8) | buffer[packetEnd - 1]; if (pakCheck != calcCheck) { if (Log.IsWarnEnabled) { Log.WarnFormat($"Bad TCP packet checksum (packet:0x{pakCheck:X4} calculated:0x{calcCheck:X4}) -> disconnecting\nclient: {_client}\ncurOffset={curOffset}; packetLength={packetLength}"); } if (Log.IsInfoEnabled) { Log.Info("Last client sent/received packets (from older to newer):"); foreach (IPacket prevPak in GetLastPackets()) { Log.Info(prevPak.ToHumanReadable()); } Log.Info(Marshal.ToHexDump("Last Received Bytes : ", buffer)); } _client.Disconnect(); return; } var pak = new GSPacketIn(packetLength - GSPacketIn.HDR_SIZE); pak.Load(buffer, curOffset, packetLength); try { HandlePacket(pak); } catch (Exception e) { if (Log.IsErrorEnabled) { Log.Error("HandlePacket(pak)", e); } } curOffset += packetLength; } while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; _client.ReceiveBufferOffset = 1; } } }