对OpenSSL非阻塞I / O感到困惑

通常,OpenSSL库(C API)似乎提供了两种方法来执行所有操作:您可以使用根据自己的喜好配置的普通系统套接字,也可以使用类似于流的OpenSSL BIO对象。

但是,我经常对一些重复的function感到困惑。 例如,如何使SSL连接无阻塞? 一种方法似乎是简单地访问底层文件描述符并使用fcntl将其设置为非阻塞。 但是还有一个名为BIO_set_nbio的OpenSSL API BIO_set_nbio ,它接收一个BIO*对象并将其设置为非阻塞模式。

那么设置非阻塞SSL套接字的最佳方法是什么? 如果您将OpenSSL传递给通过fnctl设置为非阻塞模式的本机文件描述符会发生什么? 你还需要专门调用BIO_set_nbio来使BIO对象无阻塞吗?

我认为大多数人更喜欢BIO接口,但BIO例程只使用平台上可用的任何本机非阻塞套接字API。 我不知道如果混合搭配会发生什么。

请注意,SSL的非阻塞I / O通常比TCP 复杂。 如果你不理解这种情况你将会折磨自己。 John Viega和Eric Rescorla的书籍都有这本书,你可以阅读OpenSSL邮件列表,以了解这引起的胃灼热感。 一些很好的代码示例显示了使用OpenSSL的非阻塞SSL编程,包含在TOR项目的软件和curl实用程序中。