From 1ad04bf8bf6700a236bfa4ed81835b35fdfa8dff Mon Sep 17 00:00:00 2001 From: orignal Date: Sun, 8 Feb 2015 11:52:03 -0500 Subject: [PATCH] read more data from socket if available --- NTCPSession.cpp | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 5c1883c1..029ae905 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -489,19 +489,48 @@ namespace transport if (m_ReceiveBufferOffset >= 16) { - uint8_t * nextBlock = m_ReceiveBuffer; - while (m_ReceiveBufferOffset >= 16) - { - if (!DecryptNextBlock (nextBlock)) // 16 bytes + int numReloads = 0; + do + { + uint8_t * nextBlock = m_ReceiveBuffer; + while (m_ReceiveBufferOffset >= 16) { - Terminate (); - return; + if (!DecryptNextBlock (nextBlock)) // 16 bytes + { + Terminate (); + return; + } + nextBlock += 16; + m_ReceiveBufferOffset -= 16; + } + if (m_ReceiveBufferOffset > 0) + memcpy (m_ReceiveBuffer, nextBlock, m_ReceiveBufferOffset); + + // try to read more + if (numReloads < 5) + { + boost::asio::socket_base::bytes_readable command (true); + m_Socket.io_control (command); + size_t moreBytes = command.get(); + if (moreBytes) + { + if (moreBytes > NTCP_BUFFER_SIZE - m_ReceiveBufferOffset) + moreBytes = NTCP_BUFFER_SIZE - m_ReceiveBufferOffset; + boost::system::error_code ec; + moreBytes = m_Socket.read_some (boost::asio::buffer (m_ReceiveBuffer + m_ReceiveBufferOffset, moreBytes)); + if (ec) + { + LogPrint (eLogError, "Read more bytes error: ", ec.message ()); + Terminate (); + return; + } + m_NumReceivedBytes += moreBytes; + m_ReceiveBufferOffset += moreBytes; + numReloads++; + } } - nextBlock += 16; - m_ReceiveBufferOffset -= 16; } - if (m_ReceiveBufferOffset > 0) - memcpy (m_ReceiveBuffer, nextBlock, m_ReceiveBufferOffset); + while (m_ReceiveBufferOffset >= 16); m_Handler.Flush (); }