Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поясните код. прием сообщения на сокетах 
:(
    Опции темы
kotiniibet
Дата 28.3.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.3.2008

Репутация: нет
Всего: нет



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

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'е нужен последний цикл и как работает первый? Спасибо!
PM MAIL   Вверх
korian
Дата 28.3.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



прога выполняет следующие:
если размер массива data, который определяется по maxLength, мешьне чем размер данных, которые надо принять, то принимаем только maxLength байт, остальное скипаем.
PM   Вверх
kotiniibet
Дата 28.3.2008, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.3.2008

Репутация: нет
Всего: нет



спасибо!)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.