Я работаю над клиентским приложением, которое использует OpenSSL для TLS, используя неблокирующий ввод / вывод.Обе стороны соединения могут писать в любое время, что указывает на некоторое изменение состояния.Поэтому мне нужно регулярно проверять сокет, чтобы новые данные стали доступны.Если ничего не получено, мой код должен немедленно продолжить выполнение следующей задачи: отправка новых данных с клиента на сервер.
Но я не уверен, как я могу это сделать с помощью OpenSSL-API: ВызовSSL_read()
в сокете, где данные не были получены (поскольку другая сторона ничего не отправляла), всегда приводит к коду ошибки SSL_ERROR_WANT_READ
(или даже SSL_ERROR_WANT_WRITE
в случае повторного согласования).В таком случае я могу просто продолжить выполнение следующей задачи и вызвать SSL_write()
, чтобы записать другие данные на сервер?
На странице руководства не говорится об этом подробно.В нем просто упоминается, что аргументы повторного вызова read должны быть точно такими же, как и раньше.Книга Viega et al. Сетевая безопасность с OpenSSL .и др.содержит пример неблокирующего ввода / вывода.Но автор ожидает успешного завершения SSL_read()
(чтение 1 или более байтов) и только затем вызывает SSL_write()
для отправки данных на другую сторону, что означает, что операция записи невозможна, пока данные с другой стороны не будут получены,Для моей цели это не сработает.
В двух словах: если SSL_read()
возвращается с SSL_ERROR_WANT_WRITE
или SSL_ERROR_WANT_READ
, могу ли я просто позвонить SSL_write()
с другими данными, прежде чем повторить чтение?И если нет, то как я могу добиться того, что можно читать, если доступно и писать?