Нужно ли мне обрабатывать SSL_ERROR_WANT_WRITE при SSL_read()?

#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 независимо от того, читаете вы в данный момент или пишете.