Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > OpenSSL BIO_read/SSL_read |
Автор: Router 6.6.2011, 13:10 | ||||
Задача получить ответ от сервера, после того как была отослана очередная команда, соединение при этом не разрывается. Таким образом, необходимо определить, что принимаемых данных больше нету, разобрать ответ и отослать очередную команду. Проблема в том, что все эти функции BIO_read/SSL_read, работая в блокирующем режиме, блокируются, когда нету данных которые надо принять. В итоге этот цикл зависнет сразу же или после того как примет все данные, до тех пор, пока не прейдут новые. И не выйдет из него пока соединение не закроется либо не произойдет ошибки.
Эту проблему можно решить, используя не блокирующие сокеты, но у меня не получается. Таким образом, вот код с не блокирующим сокетом ( BIO_set_nbio( sock, 1 ); ). Функция принимает данные, возможно из нескольких порций, а когда их больше нету завершает цикл и выходит.
Вродебы все логично но оно не работает. Принимает только перый раз ошибка 0 тойсть все в порядке, а при следующих попытках получить ответ на очередную команду выдает ошибку 2, что говорит об SSL_ERROR_WANT_READ. Также я заметил что при отладке ве нормально ответы принимаются полностью даже из нескольких частей. В итоге вопрос как заставить это работать или определить что уже принят весь ответ ? |
Автор: boostcoder 6.6.2011, 13:36 |
вроде бы это Ваша проблема: http://www.mail-archive.com/[email protected]/msg39582.html |
Автор: Router 6.6.2011, 14:57 |
Пожалуйста, ткните меня носом, что я там должен был увидеть ? Если вы имели ввиду функцию “select” то я думаю ее не корректно использовать с блокирующими сокетами, так как там есть внутренний буфер. А что касается не блокирующих, может все же есть другой вариант, где не надо использовать функции подобной “select” ? |
Автор: boostcoder 7.6.2011, 12:50 |
Router, дело не в SSL. с обычными сокетами в асинхронном режиме принцип такой-же. только read/write устанавливают errno в EAGAIN или EWOULDBLOCK. при работе с SSL сокетами, полагаю, принцип такой же. но, возможно, не используют errno. |