一般来说,OpenSSL 库(C API)似乎提供了两种方法来完成所有事情:您可以使用根据您的喜好配置的普通系统套接字,或者您可以使用 OpenSSL BIO
对象,这些对象是有点像流。
但是,我经常对一些重复的功能感到困惑。例如,如何使 SSL 连接成为非阻塞的?一种方法似乎是简单地访问底层文件描述符并使用 fcntl
将其设置为非阻塞。但是还有一个名为 BIO_set_nbio
的 OpenSSL API 函数,它接受一个 BIO*
对象并将其设置为非阻塞模式。
那么设置非阻塞 SSL 套接字的最佳方法是什么?如果您向 OpenSSL 传递一个 native 文件描述符,该文件描述符已经通过 fnctl
设置为非阻塞模式,会发生什么情况?还需要专门调用BIO_set_nbio
让BIO
对象成为非阻塞的吗?
最佳答案
我认为大多数人更喜欢 BIO 接口(interface),但 BIO 例程只使用平台上可用的任何 native 非阻塞套接字 API。我不知道如果混合搭配会发生什么。
请注意,SSL 的非阻塞 I/O 通常比 TCP 复杂很多。如果你不明白这是怎么回事,你就是在折磨自己。 John Viega 有书和另一个 Eric Rescorla进入这个,你当然可以阅读 OpenSSL 邮件列表来了解这引起的胃灼热。 TOR project 的软件中包含一些很好的代码示例,展示了使用 OpenSSL 进行非阻塞 SSL 编程。 , 和 curl效用。
关于对 OpenSSL 非阻塞 I/O 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397788/