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

时间:2011-03-22 21:02:11

标签: c security ssl openssl nonblocking

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

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

那么设置非阻塞SSL套接字的最佳方法是什么?如果您通过fnctl将OpenSSL传递给已经设置为非阻塞模式的本机文件描述符,会发生什么?您是否仍需要专门致电BIO_set_nbio以使BIO对象无阻塞?

1 个答案:

答案 0 :(得分:8)

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

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