У меня TCP-клиент и сервер, общающийся через OpenSSL, используя неблокирующие сокеты Все чтения и записи в сокеты всегда выполняются из одного потока. Соединение открыто до тех пор, пока клиент не будет запущен, и соединение не будет следовать модели запрос-ответ.
Клиент непрерывно отправляет сообщения на сервер, который регистрирует сообщения в базе данных. Клиент может время от времени отправлять запрос на данные и будет читать их из сокета:
Клиент
SSL_write...
SSL_write
SSL_write
...
Написать запрос на получение данных из БД
(Ожидание данных в SSL_read ...)
SSL_read
... Полученные данные, написание резюме
SSL_write
SSL_write
SSL_write
Сервер
Сервер читает в цикле, пока данные не будут доступны
Когда запрос данных из БД получен, второй поток подготавливает данные, пока цикл чтения в основном потоке продолжается. Поскольку клиент ожидает данные, SSL_read на сервере завершится ошибкой с SSL_ERROR_WANT_READ.
Обработка ошибки SSL_ERROR_WANT_READ:
Сервер пытается выяснить, доступен ли сокет для чтения, а если нет, чтение завершено, отправляет данные клиенту, если он доступен в буфере, и основной цикл переходит к операции выбора для прослушивания входящих сообщений.
Клиент успешно получает данные и снова пытается выполнить запись на сервер. Но с этого момента сервер не регистрирует их в сокете, и данные не записываются в базу данных.
Вопрос:
1 / Является ли эта модель, когда клиент отправляет SSL_write, иногда прерываемой с SSL_read подходящей для OpenSSL?
2 / Правильно ли для сервера отправлять ответ клиенту (SSL_write) в середине цикла SSL_read?
3 / Каков правильный подход?
Спасибо за любые идеи.
Edit1:
По сути, происходит то, что после того, как сервер успешно отправляет данные обратно клиенту, «Выбрать на сервере» не сигнализирует о готовности файловых дескрипторов. Обратите внимание, что клиент отправляет дополнительные данные после получения данных с сервера. Данные отправляются с клиента без ошибок, однако сервер Select не отвечает на них.
EDIT2:
Я заметил, что моя Ubuntu 18.04 обновила OpenSSL с 1.1.0g до 1.1.1, и упомянутая проблема возникла только после этого обновления.