Я не могу записать в сокет сервера SSL из потоков, запускаемых на клиенте (каждый поток создает сокет, CTX, SSL, ... отдельно).
Клиент
клиент запускает 2 потока, каждый поток создает соединение SSL.Каждый поток выполняет три записи SSL_write:
Thread1 - сеанс SSL1
sockfd = socket(AF_INET, SOCK_STREAM, 0);
SSL_CTX *ctx = setup_client_ctx();
ssl = SSL_new(ctx);
SSL_set_fd(ssl, sockfd);
err = SSL_connect(ssl);
Клиент подключается к SSL и выполняет запись на сервер:
SSL_write(..."message1"...);
SSL_write(..."message2"...);
SSL_write(..."message3"...);
Соединение установленооставлено открытым.
Thread2 - сеанс SSL2
sockfd = socket(AF_INET, SOCK_STREAM, 0);
SSL_CTX *ctx = setup_client_ctx();
ssl = SSL_new(ctx)
SSL_set_fd(ssl, sockfd);
err = SSL_connect(ssl);
Клиент подключается к SSL и выполняет запись на сервер
SSL_write(..."message4"...)
SSL_write(..."message5"...)
SSL_write(..."message6"...)
После записи соединение остается открытым
Сервер
while(true)
{
while (data_size > 0)
{
bytes_recv = SSL_read(ssl, data, data_size);
if (bytes_recv <= 0)
{
return bytes_recv;
}
data += bytes_recv;
data_size -= bytes_recv;
}
return 1;
}
Результат
Сервер запускает цикл выше.Он получает сообщения 4-6 из второго потока и затем висит на SSL_read.Сообщения 4-6 поступили в сеансе SSL2, поэтому я думал, что SSL_read вернется со значением 0, так как у меня есть неблокирующий сокет, и в этом сеансе нет других данных.Но это никогда не вернется.В то же время клиент висит в потоке 1 на SSL_connect с session1, что означает, что сообщение1 не может быть отправлено.
Я думаю, что проблема с сессиями и что сервер использует сеанс из предыдущегоподключение нити2.Что с этим делать?Или проблема в другом месте?
Это пример сообщений трассировки
Started thread1 (session1)
Started thread2 (session2)
Going to connect to TCP sock from thread2
Going to connect to SSL sock from thread2
Going to connect to SSL from thread1
Writing to the server from thread2
Finished thread2
Обновление Кажется, что сетевые буферы пусты (потому что select не выбираетлюбое входящее соединение) и данные из обоих сеансов находятся в буфере SSL.SSL_read считывает данные из одного сеанса, а когда следующие данные из другого сеанса, он просто зависает.