@ -3708,8 +3708,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
// requires LOCK(cs_vRecvMsg)
// requires LOCK(cs_vRecvMsg)
bool ProcessMessages ( CNode * pfrom )
bool ProcessMessages ( CNode * pfrom )
{
{
if ( pfrom - > vRecvMsg . empty ( ) )
return true ;
//if (fDebug)
//if (fDebug)
// printf("ProcessMessages(%zu messages)\n", pfrom->vRecvMsg.size());
// printf("ProcessMessages(%zu messages)\n", pfrom->vRecvMsg.size());
@ -3721,29 +3719,34 @@ bool ProcessMessages(CNode* pfrom)
// (4) checksum
// (4) checksum
// (x) data
// (x) data
//
//
bool fOk = true ;
unsigned int nMsgPos = 0 ;
std : : deque < CNetMessage > : : iterator it = pfrom - > vRecvMsg . begin ( ) ;
for ( ; nMsgPos < pfrom - > vRecvMsg . size ( ) ; nMsgPos + + )
while ( it ! = pfrom - > vRecvMsg . end ( ) ) {
{
// Don't bother if send buffer is too full to respond anyway
// Don't bother if send buffer is too full to respond anyway
if ( pfrom - > vSend . size ( ) > = SendBufferSize ( ) )
if ( pfrom - > vSend . size ( ) > = SendBufferSize ( ) )
break ;
break ;
// get next message; end, if an incomplete message is found
// get next message
CNetMessage & msg = pfrom - > vRecvMsg [ nMsgPos ] ;
CNetMessage & msg = * it ;
//if (fDebug)
//if (fDebug)
// printf("ProcessMessages(message %u msgsz, %zu bytes, complete:%s)\n",
// printf("ProcessMessages(message %u msgsz, %zu bytes, complete:%s)\n",
// msg.hdr.nMessageSize, msg.vRecv.size(),
// msg.hdr.nMessageSize, msg.vRecv.size(),
// msg.complete() ? "Y" : "N");
// msg.complete() ? "Y" : "N");
// end, if an incomplete message is found
if ( ! msg . complete ( ) )
if ( ! msg . complete ( ) )
break ;
break ;
// at this point, any failure means we can delete the current message
it + + ;
// Scan for message start
// Scan for message start
if ( memcmp ( msg . hdr . pchMessageStart , pchMessageStart , sizeof ( pchMessageStart ) ) ! = 0 ) {
if ( memcmp ( msg . hdr . pchMessageStart , pchMessageStart , sizeof ( pchMessageStart ) ) ! = 0 ) {
printf ( " \n \n PROCESSMESSAGE: INVALID MESSAGESTART \n \n " ) ;
printf ( " \n \n PROCESSMESSAGE: INVALID MESSAGESTART \n \n " ) ;
return false ;
fOk = false ;
break ;
}
}
// Read header
// Read header
@ -3779,7 +3782,7 @@ bool ProcessMessages(CNode* pfrom)
fRet = ProcessMessage ( pfrom , strCommand , vRecv ) ;
fRet = ProcessMessage ( pfrom , strCommand , vRecv ) ;
}
}
if ( fShutdown )
if ( fShutdown )
return t ru e;
b reak ;
}
}
catch ( std : : ios_base : : failure & e )
catch ( std : : ios_base : : failure & e )
{
{
@ -3808,11 +3811,8 @@ bool ProcessMessages(CNode* pfrom)
printf ( " ProcessMessage(%s, %u bytes) FAILED \n " , strCommand . c_str ( ) , nMessageSize ) ;
printf ( " ProcessMessage(%s, %u bytes) FAILED \n " , strCommand . c_str ( ) , nMessageSize ) ;
}
}
// remove processed messages; one incomplete message may remain
pfrom - > vRecvMsg . erase ( pfrom - > vRecvMsg . begin ( ) , it ) ;
if ( nMsgPos > 0 )
return fOk ;
pfrom - > vRecvMsg . erase ( pfrom - > vRecvMsg . begin ( ) ,
pfrom - > vRecvMsg . begin ( ) + nMsgPos ) ;
return true ;
}
}