#openssl #nonblocking #handshake
#openssl #неблокирующий #рукопожатие
Вопрос:
Я читаю учебник по программированию на openssl.
Я не могу допустить, чтобы серверное приложение блокировалось при какой-либо операции для одного соединения,
поэтому я буду использовать неблочные сокеты.
Поскольку, похоже, ssl-квитирование происходит при ssl_accept и ssl_connect,
и это может быть заблокировано, мне придется установить сокет в положение non-block перед вызовом ssl_accept.
В учебном документе говорится, что мне нужно обрабатывать SSL_ERROR_WANT_WRITE (плюс, конечно, SSL_ERROR_WANT_READ) при SSL_read, потому что повторная обработка SSL может произойти в любое время.
И SSL_ERROR_WANT_READ при SSL_write по той же причине.
Из документа,
Мы получаем WANT_WRITE, если пытаемся повторно выполнить обмен данными, и блокируем запись во время этого повторного обмена данными.
Нам нужно дождаться, пока сокет станет доступным для записи, но повторно инициировать чтение, когда оно
Я запутался в части «повторного» подтверждения связи.
Я не планирую сохранять состояние ssl и повторно использовать его (это называется возобновлением сеанса?) После первого установления связи мне не придется иметь дело с установлением связи для того же соединения.
Интересно, нужно ли мне все еще беспокоиться о WANT_WRITE при SSL_read и наоборот, когда я не собираюсь использовать возобновление сеанса.
Спасибо
Ответ №1:
Изменение обработки может быть инициировано любой стороной в любой момент во время соединения. На самом деле это не имеет прямого отношения к возобновлению сеанса.
Итак, да, если вы хотите, чтобы ваше приложение было надежным, вы должны быть готовы обрабатывать как SSL_WANT_WRITE
, так и SSL_WANT_READ
независимо от того, читаете вы в данный момент или пишете.