我无法从客户端上运行的线程写入SSL服务器套接字(每个线程分别创建一个套接字,CTX,SSL等)。
客户端运行2个线程,每个线程创建一个SSL连接。 每个线程执行三个写入SSL_write:
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"...);
连接保持打开状态。
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到达SSL会话2,因此我认为SSL_read将返回值为0,因为我具有非阻塞套接字,并且此会话上没有其他数据。但它永远不会回来。同时,客户端通过会话1挂在SSL_connect上的线程1中,这意味着无法发送message1。
我认为问题出在会话上,并且服务器正在使用线程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从一个会话读取数据,而当下一个数据从另一个会话读取时,它将挂起。