Beispiel #1
0
		/// <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;
				}
			}
		}
Beispiel #2
0
		/// <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;
				}
			}
		}
Beispiel #3
0
        /// <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;
                }
            }
        }