Вызов SSL_write (), когда SSL_read () вернул WANT_READ - PullRequest
0 голосов
/ 30 мая 2018

Я работаю над клиентским приложением, которое использует 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() с другими данными, прежде чем повторить чтение?И если нет, то как я могу добиться того, что можно читать, если доступно и писать?

1 Ответ

0 голосов
/ 30 мая 2018

SSL_ERROR_WANT_WRITE или SSL_ERROR_WANT_READ не обязательно означает состояние ошибки.Это означает, что для того, чтобы продолжить, сначала необходимо выполнить чтение или запись.

Следовательно, если ваш SSL_read возвращает один из них.Если вам нужно дождаться выполнения условия, просто пример из книги, которую вы упомянули.До тех пор, пока не будет вызван любой другой API SSL, включая SSL_write, не будет работать.

Возможно, вы можете использовать, если не используется, выбрать / poll / epoll или что-то еще, чтобы узнать любую сетевую активность в вашем сокете

...