Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > поясните код. прием сообщения на сокетах


Автор: kotiniibet 28.3.2008, 21:14
В универе по программе сокеты. Препод написал нам базовые классы, которми сказал пользоваться. По самонадеянности семинар, где он рассказывал, почему нужно делать так, а не иначе я пропустил: весна на дворе...
Собственно не понятен один только метод 
Код

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'е нужен последний цикл и как работает первый? Спасибо!

Автор: korian 28.3.2008, 21:44
прога выполняет следующие:
если размер массива data, который определяется по maxLength, мешьне чем размер данных, которые надо принять, то принимаем только maxLength байт, остальное скипаем.

Автор: kotiniibet 28.3.2008, 21:49
спасибо!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)