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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenSSL BIO_read/SSL_read, blocked & non-blocked 
:(
    Опции темы
Router
Дата 6.6.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задача получить ответ от сервера, после того как была отослана очередная команда, соединение при этом не разрывается. Таким образом, необходимо определить, что принимаемых данных больше нету, разобрать ответ и отослать очередную команду.

Проблема в том, что все эти функции BIO_read/SSL_read, работая в блокирующем режиме, блокируются, когда нету данных которые надо принять. В итоге этот цикл зависнет сразу же или после того как примет все данные, до тех пор, пока не прейдут новые. И не выйдет из него пока соединение не закроется либо не произойдет ошибки.

Код

while( 1 )
{
    res = BIO_read( sock, request, sizeof(request) );
    if ( res <= 0 ) break;
    ...    ...    ...
}


Эту проблему можно решить, используя не блокирующие сокеты, но у меня не получается.
Таким образом, вот код с не блокирующим сокетом ( BIO_set_nbio( sock, 1 ); ).
Функция принимает данные, возможно из нескольких порций, а когда их больше нету завершает цикл и выходит.

Код

void read_socket ( )
{
    do
    {
        res = BIO_read( sock, request, sizeof(request) );
        err = SSL_get_error( ssl, res );
        printf( "read = %d\r\n", err );

        if ( err == SSL_ERROR_NONE ) {
            // TODO: output into somewhere
            ...    ...    ...
        }
    }
    while( res > 0 );
}


Вродебы все логично но оно не работает. Принимает только перый раз ошибка 0 тойсть все в порядке, а при следующих попытках получить ответ на очередную команду выдает ошибку 2, что говорит об SSL_ERROR_WANT_READ.

Также я заметил что при отладке ве нормально ответы принимаются полностью даже из нескольких частей.

В итоге вопрос как заставить это работать или определить что уже принят весь ответ ?



PM MAIL   Вверх
boostcoder
Дата 6.6.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



вроде бы это Ваша проблема: http://www.mail-archive.com/[email protected]/msg39582.html
PM WWW   Вверх
Router
Дата 6.6.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пожалуйста, ткните меня носом, что я там должен был увидеть ?

Если вы имели ввиду функцию “select” то я думаю ее не корректно использовать с блокирующими сокетами, так как там есть внутренний буфер.
А что касается не блокирующих, может все же есть другой вариант, где не надо использовать функции подобной “select” ?


PM MAIL   Вверх
boostcoder
Дата 7.6.2011, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Router, дело не в SSL.
с обычными сокетами в асинхронном режиме принцип такой-же. только read/write устанавливают errno в EAGAIN или EWOULDBLOCK.
при работе с SSL сокетами, полагаю, принцип такой же. но, возможно, не используют errno.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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