我正在尝试使 SSL_read() 阻塞,直到从服务器接收到数据。我尝试在我的“连接”代码中将套接字设置为阻塞
{
u_long iMode = 1;
i = ioctlsocket(sock, FIONBIO, &iMode);
}
但奇怪的是我每次都会收到堆栈溢出异常。
还有其他更正确的方法吗?
(注意:如果我省略此代码,该应用程序就可以正常工作)。
我已经在这个问题上搜索过 SO 但到处都有人似乎有相反的问题,即当他们想要非阻塞时阻塞。
代码概要:
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
答案 0 :(得分:0)
通过从 SSL_* 调用切换到用于连接、读取、写入等的 BIO_* 调用,我实现了我想要的。
BIO 系列包括用于设置阻塞/非阻塞模式的函数“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)