非阻塞SSL套接字,读取时具有多线程客户端阻塞

时间:2019-02-12 07:31:50

标签: sockets session ssl openssl

我无法从客户端上运行的线程写入SSL服务器套接字(每个线程分别创建一个套接字,CTX,SSL等)。

客户

客户端运行2个线程,每个线程创建一个SSL连接。 每个线程执行三个写入SSL_write:

线程1-SSL会话1

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"...);

连接保持打开状态。

线程2-SSL会话2

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从一个会话读取数据,而当下一个数据从另一个会话读取时,它将挂起。

0 个答案:

没有答案