mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-31 09:04:14 +00:00
allocated bigger buffer for remaining data
This commit is contained in:
parent
cea6ea4344
commit
2e1c508bc4
@ -493,7 +493,8 @@ namespace transport
|
|||||||
|
|
||||||
void NTCPSession::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
void NTCPSession::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
if (ecode) {
|
if (ecode)
|
||||||
|
{
|
||||||
if (ecode != boost::asio::error::operation_aborted)
|
if (ecode != boost::asio::error::operation_aborted)
|
||||||
LogPrint (eLogDebug, "NTCP: Read error: ", ecode.message ());
|
LogPrint (eLogDebug, "NTCP: Read error: ", ecode.message ());
|
||||||
//if (ecode != boost::asio::error::operation_aborted)
|
//if (ecode != boost::asio::error::operation_aborted)
|
||||||
@ -507,51 +508,57 @@ namespace transport
|
|||||||
|
|
||||||
if (m_ReceiveBufferOffset >= 16)
|
if (m_ReceiveBufferOffset >= 16)
|
||||||
{
|
{
|
||||||
int numReloads = 0;
|
// process received data
|
||||||
do
|
uint8_t * nextBlock = m_ReceiveBuffer;
|
||||||
{
|
while (m_ReceiveBufferOffset >= 16)
|
||||||
uint8_t * nextBlock = m_ReceiveBuffer;
|
{
|
||||||
while (m_ReceiveBufferOffset >= 16)
|
if (!DecryptNextBlock (nextBlock)) // 16 bytes
|
||||||
{
|
{
|
||||||
if (!DecryptNextBlock (nextBlock)) // 16 bytes
|
Terminate ();
|
||||||
{
|
return;
|
||||||
Terminate ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nextBlock += 16;
|
|
||||||
m_ReceiveBufferOffset -= 16;
|
|
||||||
}
|
|
||||||
if (m_ReceiveBufferOffset > 0)
|
|
||||||
memcpy (m_ReceiveBuffer, nextBlock, m_ReceiveBufferOffset);
|
|
||||||
|
|
||||||
// try to read more
|
|
||||||
if (numReloads < 16) // ~16K
|
|
||||||
{
|
|
||||||
boost::system::error_code ec;
|
|
||||||
size_t moreBytes = m_Socket.available(ec);
|
|
||||||
if (moreBytes && !ec)
|
|
||||||
{
|
|
||||||
if (moreBytes > NTCP_BUFFER_SIZE - m_ReceiveBufferOffset)
|
|
||||||
moreBytes = NTCP_BUFFER_SIZE - m_ReceiveBufferOffset;
|
|
||||||
moreBytes = m_Socket.read_some (boost::asio::buffer (m_ReceiveBuffer + m_ReceiveBufferOffset, moreBytes), ec);
|
|
||||||
if (ec)
|
|
||||||
{
|
|
||||||
LogPrint (eLogInfo, "NTCP: Read more bytes error: ", ec.message ());
|
|
||||||
Terminate ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_NumReceivedBytes += moreBytes;
|
|
||||||
i2p::transport::transports.UpdateReceivedBytes (moreBytes);
|
|
||||||
m_ReceiveBufferOffset += moreBytes;
|
|
||||||
numReloads++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break; // no more data
|
|
||||||
}
|
}
|
||||||
|
nextBlock += 16;
|
||||||
|
m_ReceiveBufferOffset -= 16;
|
||||||
}
|
}
|
||||||
while (m_ReceiveBufferOffset >= 16);
|
if (m_ReceiveBufferOffset > 0)
|
||||||
m_Handler.Flush ();
|
memcpy (m_ReceiveBuffer, nextBlock, m_ReceiveBufferOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// read and process more is available
|
||||||
|
boost::system::error_code ec;
|
||||||
|
size_t moreBytes = m_Socket.available(ec);
|
||||||
|
if (moreBytes && !ec)
|
||||||
|
{
|
||||||
|
uint8_t * buf = nullptr, * moreBuf = m_ReceiveBuffer;
|
||||||
|
if (moreBytes + m_ReceiveBufferOffset > NTCP_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
buf = new uint8_t[moreBytes + m_ReceiveBufferOffset];
|
||||||
|
if (m_ReceiveBufferOffset)
|
||||||
|
memcpy (buf, m_ReceiveBuffer, m_ReceiveBufferOffset);
|
||||||
|
moreBuf = buf;
|
||||||
|
}
|
||||||
|
moreBytes = m_Socket.read_some (boost::asio::buffer (moreBuf + m_ReceiveBufferOffset, moreBytes), ec);
|
||||||
|
m_ReceiveBufferOffset += moreBytes;
|
||||||
|
m_NumReceivedBytes += moreBytes;
|
||||||
|
i2p::transport::transports.UpdateReceivedBytes (moreBytes);
|
||||||
|
// process more data
|
||||||
|
uint8_t * nextBlock = moreBuf;
|
||||||
|
while (m_ReceiveBufferOffset >= 16)
|
||||||
|
{
|
||||||
|
if (!DecryptNextBlock (nextBlock)) // 16 bytes
|
||||||
|
{
|
||||||
|
delete[] buf;
|
||||||
|
Terminate ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nextBlock += 16;
|
||||||
|
m_ReceiveBufferOffset -= 16;
|
||||||
|
}
|
||||||
|
if (m_ReceiveBufferOffset > 0)
|
||||||
|
memcpy (m_ReceiveBuffer, nextBlock, m_ReceiveBufferOffset); // nextBlock points to memory inside buf
|
||||||
|
delete[] buf;
|
||||||
|
}
|
||||||
|
m_Handler.Flush ();
|
||||||
|
|
||||||
m_LastActivityTimestamp = i2p::util::GetSecondsSinceEpoch ();
|
m_LastActivityTimestamp = i2p::util::GetSecondsSinceEpoch ();
|
||||||
Receive ();
|
Receive ();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user