首先,你的Q不是很清楚。SSL是 C 结构类型(的 typedef),您不能在 C 中的结构类型上使用点运算符,只能在实例上使用。即使假设您的意思是“的实例SSL”,就像人们有时所做的那样,在旧版本中(通过 1.0.2)它没有成员read,write并且在 1.1.0 更高版本中它是不透明的——您甚至不知道它是什么成员是。
其次,有两种不同级别的 BIO 使用适用于 SSL 库。SSL/TLS 连接(由SSL对象表示,加上一些与它相关的东西,如会话)总是使用两个 BIO 分别发送和接收协议数据——包括包含您发送SSL_write和接收的应用程序数据的协议数据SSL_read,以及在库中处理的 SSL/TLS 握手。正如Steffen 所描述的那样,这些通常都设置为一个 socket-BIO,用于向适当的远程主机进程发送和接收,但它们可以设置为在两者之间执行其他操作的 BIO,甚至可以代替。(这种正常情况是由自动创建的SSL_set_{,r,w}fd应该注意的是,在 Windows 上实际上需要一个套接字句柄——但不是任何其他文件句柄;只有在 Unix 上,套接字描述符才能与文件描述符半互换。)
另外,SSL/TLS 连接本身可以“包装”在 ssl-BIO 中。这允许应用程序使用与普通 TCP 连接(使用 socket-BIO)或本地文件几乎相同的 API 调用来处理 SSL/TLS 连接,以及提供的“过滤器”BIO,如摘要 (md) BIO或 base64 编码/解码 BIO,以及您添加的任何其他 BIO。您链接的 IBM 网页就是这种情况(BTW 是客户端而不是服务器)。这类似于 Unix 的“一切都是(大部分)文件”哲学,例如实用程序grep,只需调用read在 fd 0 上,可以从文件、终端、来自另一个程序的管道或(如果在 inetd 或类似系统下运行)使用 TCP(但不是 SSL/TLS,因为它不在操作系统中)从远程系统中搜索数据)。我还没有遇到很多能够轻松地将 SSL/TLS 数据与其他类型的源/接收器交换特别有益的情况,但是 OpenSSL 确实提供了这种能力。