如何使 SSL 读取块?

How to make SSL reads block?

我正在尝试使 SSL_read() 阻塞,直到从服务器接收到数据。我尝试在我的“连接”代码中将套接字设置为阻塞

  {
    u_long iMode = 1;
    i = ioctlsocket(sock, FIONBIO, &iMode);
  }

但奇怪的是我每次都会遇到堆栈溢出异常。
还有其他更正确的方法吗?
(注意:如果我省略这段代码,应用程序工作正常)。
我在这个问题上进行了搜索,但到处都是人们似乎遇到了相反的问题,即在他们想要非阻塞时阻塞。

代码概要:

Get method: TLS_client_method()
Get CTX: SSL_CTX_new(method)
Create socket 'sock'
set socket to blocking (code above)
Connect sock to host on port 443
Create SSL*: ssl=SSL_new(ctx)
SSL_set_fd(ssl, sock)  
Do SSL_reads and writes

我通过从 SSL_* 调用切换到 BIO_* 调用连接、读取、写入等实现了我想要的。

BIO 系列包含设置 blocking/nonblocking 模式的函数 'BIO_set_nbio()'。效果很好。

示例代码概要(例如,google.com):

Get method: method = TLS_client_method()
Get CTX: ctx = SSL_CTX_new(method)
Create BIO object: bio = BIO_new_ssl_connect( ctx )
Create socket 'sock'
Connect 'sock' to google.com, port 443
Create SSL*: ssl = SSL_new(ctx)
SSL_set_mode( ssl, SSL_MODE_AUTO_RETRY )
BIO_set_conn_hostname( bio, "google.com:443" )
BIO_do_connect( bio )
BIO_set_nbio( bio, mode ) (with mode=0 for blocking)
Now can do blocking BIO_reads and writes (with BIO_read, BIO_write)