Библиотека OpenSSL позволяет читать из базового сокета с SSL_read и записывать в него с помощью SSL_write. Эти функции могут возвращаться с использованием SSL_ERROR_WANT_READ или SSL_ERROR_WANT_WRITE в зависимости от требований протокола ssl (например, при перестройке соединения).
Я действительно не понимаю, что API хочет, чтобы я сделал с этими результатами.
Отображение серверного приложения, которое принимает клиентские соединения, устанавливает новый сеанс ssl, блокирует базовый сокет, а затем добавляет filedescriptor в цикл 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 позаботиться об этом? Но как насчет сообщения, которое должно быть написано в первую очередь?
Или нужно ли читать чтение сразу после неудачной записи? Затем, что защищает от чтения байтов из протокола приложения и затем имеет дело с ним где-то на окраине приложения, когда настоящий синтаксический анализатор сидит в mainloop?