Библиотека OpenSSL позволяет читать из нижележащего сокета с SSL_read и записывать в него с SSL_write. Эти функции могут возвращаться с SSL_ERROR_WANT_READ или SSL_ERROR_WANT_WRITE в зависимости от потребностей их протокола ssl (например, при повторном согласовании соединения).
Я не совсем понимаю, что API хочет, чтобы я делал с этими результатами.
Создание образа серверного приложения, которое принимает клиентские подключения, устанавливает новый сеанс ssl, делает неблокируемый основной сокет, а затем добавляет дескриптор файла в цикл select / poll / epoll.
Если клиент отправляет данные, основной цикл отправляет их в ssl_read. Что нужно сделать здесь, если возвращается SSL_ERROR_WANT_READ или SSL_ERROR_WANT_WRITE? WANT_READ может быть простым, потому что следующая итерация основного цикла может просто привести к другому ssl_read. Но если ssl_read возвращает WANT_WRITE, с какими параметрами он должен вызываться? И почему библиотека не выдает сам вызов?
Если сервер хочет отправить клиенту некоторые данные, он будет использовать ssl_write. Опять же, что делать, если возвращены WANT_READ или WANT_WRITE? Можно ли ответить на WANT_WRITE, повторив тот же самый вызов, который только что был вызван? И если WANT_READ возвращается, следует ли вернуться в основной цикл и позволить select / poll / epoll позаботиться об этом? Но как насчет сообщения, которое должно быть написано в первую очередь?
Или чтение должно быть сделано сразу после неудачной записи? Тогда, что защищает от чтения байтов из протокола приложения и необходимости иметь дело с ним где-то на окраине приложения, когда настоящий парсер сидит в основной лупе?