В универе по программе сокеты. Препод написал нам базовые классы, которми сказал пользоваться. По самонадеянности семинар, где он рассказывал, почему нужно делать так, а не иначе я пропустил: весна на дворе... Собственно не понятен один только метод | Код | int Connection::Recieve( void* data, int maxLength ) { TestConnectionValid();
if ( data == 0 ) { throw "Connection::Recieve: NULL data value"; }
if ( maxLength <= 0 ) { throw "Connection::Recieve: Invalid max data length"; }
int totalLength; if ( recv( m_clientSocket, (char*)&totalLength, sizeof(int), 0 ) != sizeof(int) ) { throw "Connection::Recieve: Can't recieve data length"; } if ( totalLength <= 0 ) { throw "Connection::Recieve: Invalid data length"; } int length = totalLength; while( length > 0 && maxLength > 0 ) { int recieved = recv( m_clientSocket, (char*)data, ( length <= maxLength )? length: maxLength, 0 );
if ( recieved <= 0 ) { throw "Connection::Recieve: Can't recieve data"; }
data = ((char*)data) + recieved; maxLength -= recieved; length -= recieved; } if ( length > 0 ) { char skipBuffer[ 1024 ]; while( length > 0 ) { int skipped = recv( m_clientSocket, (char*)skipBuffer, ( length <= sizeof(skipBuffer) )? length: sizeof(skipBuffer), 0 );
if ( skipped <= 0 ) { throw "Connection::Recieve: Can't skip data"; }
length -= skipped; } } return totalLength; } |
. Мы принимаем сообщение затем начинаем пропускать какие-то куски?.. Функция отпраки сообщения ничего особенного не делает: просто шлет сначала длинну сообщения, а после его само... Вот она| Код | void Connection::Send( const void* data, int length ) { TestConnectionValid();
if ( data == 0 ) { throw "Connection::Send: NULL data value"; }
if ( length <= 0 ) { throw "Connection::Send: Invalid data length"; }
if ( send( m_clientSocket, (char*)&length, sizeof(int), 0) != sizeof(int) ) { throw "Connection::Send: Can't send data length"; } if ( send( m_clientSocket, (char*)data, length, 0 ) != length ) { throw "Connection::Send: Can't send data"; } } |
. Поясните, зачем в reciv'е нужен последний цикл и как работает первый? Спасибо! |