Чередовать SSL_read и SSL_read из одного потока - PullRequest
0 голосов
/ 05 июля 2019

У меня 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, и упомянутая проблема возникла только после этого обновления.

...