![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Router |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.11.2007 Репутация: нет Всего: нет |
Задача получить ответ от сервера, после того как была отослана очередная команда, соединение при этом не разрывается. Таким образом, необходимо определить, что принимаемых данных больше нету, разобрать ответ и отослать очередную команду.
Проблема в том, что все эти функции BIO_read/SSL_read, работая в блокирующем режиме, блокируются, когда нету данных которые надо принять. В итоге этот цикл зависнет сразу же или после того как примет все данные, до тех пор, пока не прейдут новые. И не выйдет из него пока соединение не закроется либо не произойдет ошибки.
Эту проблему можно решить, используя не блокирующие сокеты, но у меня не получается. Таким образом, вот код с не блокирующим сокетом ( BIO_set_nbio( sock, 1 ); ). Функция принимает данные, возможно из нескольких порций, а когда их больше нету завершает цикл и выходит.
Вродебы все логично но оно не работает. Принимает только перый раз ошибка 0 тойсть все в порядке, а при следующих попытках получить ответ на очередную команду выдает ошибку 2, что говорит об SSL_ERROR_WANT_READ. Также я заметил что при отладке ве нормально ответы принимаются полностью даже из нескольких частей. В итоге вопрос как заставить это работать или определить что уже принят весь ответ ? |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
вроде бы это Ваша проблема: http://www.mail-archive.com/[email protected]/msg39582.html
|
|||
|
||||
Router |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.11.2007 Репутация: нет Всего: нет |
Пожалуйста, ткните меня носом, что я там должен был увидеть ?
Если вы имели ввиду функцию “select” то я думаю ее не корректно использовать с блокирующими сокетами, так как там есть внутренний буфер. А что касается не блокирующих, может все же есть другой вариант, где не надо использовать функции подобной “select” ? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
Router, дело не в SSL.
с обычными сокетами в асинхронном режиме принцип такой-же. только read/write устанавливают errno в EAGAIN или EWOULDBLOCK. при работе с SSL сокетами, полагаю, принцип такой же. но, возможно, не используют errno. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |