通常,OpenSSL库(C API)似乎提供了两种方法来执行所有操作:您可以使用根据自己的喜好配置的普通系统套接字,也可以使用类似OpenSSL BIO
的对象流。
但是,我经常对一些重复的功能感到困惑。例如,如何使SSL连接无阻塞?一种方法似乎是简单地访问底层文件描述符并使用fcntl
将其设置为非阻塞。但是还有一个名为BIO_set_nbio
的OpenSSL API函数,该函数接收BIO*
对象并将其设置为非阻塞模式。
那么设置非阻塞SSL套接字的最佳方法是什么?如果您通过fnctl
将OpenSSL传递给已经设置为非阻塞模式的本机文件描述符,会发生什么?您是否仍需要专门致电BIO_set_nbio
以使BIO
对象无阻塞?
答案 0 :(得分:8)
我认为大多数人更喜欢BIO接口,但BIO例程只使用平台上可用的任何本机非阻塞套接字API。我不知道如果你混搭会发生什么。
请注意,SSL的非阻塞I / O通常比TCP更难。如果你不理解这种情况你将会折磨自己。有John Viega的书籍和Eric Rescorla的另一本书,你可以阅读OpenSSL邮件列表,以了解这引起的胃灼热。一些很好的代码示例显示了使用OpenSSL的非阻塞SSL编程,包含在TOR project和curl实用程序的软件中。