SSL_connect()
返回-1,SSL_get_error()
返回SSL_ERROR_WANT_READ
。然后我将文件描述符放入一个带有设置为10秒的timeval
结构的select()
中,但select()
超时了。我启动了Wireshark,我看到“Client Hello”发送出去,我看到
ServerHello
返回给客户端,但它从未在select()
中“唤醒”,它只是超时了。我的问题是:
我是否需要使用
BIO_new_socket()
创建BIO对象,然后使用SSL_set_bio()
将BIO对象分配给我的SSL对象?SSL_set_fd()
的手册说它将自动创建一个BIO对象,因此似乎意味着您永远不必调用SSL_set_bio()
这种似乎是无用的函数。假设我们使用
SSL_set_fd()
并分配一个连接的TCP文件描述符,该文件描述符是阻塞的。假设我们稍后使用fcntl()
将该文件描述符更改为非阻塞。这会以任何方式破坏SSL对象(或基础BIO对象)吗?
apps/ocsp.c
的源代码,看看 OpenSSL 是如何处理的。我记得正常的上下文是以阻塞模式设置的,然后使用底层套接字切换到非阻塞模式。搜索调用BIO_get_fd
和select
的代码。据我所知,它是自文档化代码中唯一的非阻塞 I/O 示例 :) - jww