OpenSSL库允许使用SSL_read从底层套接字进行读取,并使用SSL_write对其进行写入.这些函数可能返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,具体取决于它们的SSL协议需要(例如,在重新协商连接时).

我真的不明白API希望我如何处理这些结果.

对服务器应用程序进行映像,该应用程序接受客户端连接,设置新的ssl会话,使底层套接字不阻塞,然后将filedescriptor添加到select/poll/epoll循环中.

如果客户端发送数据,主循环会将其发送到ssl_读取.如果返回SSL\u错误\u希望\u读取或SSL\u错误\u希望\u写入,必须在此处执行什么操作?WANT_-READ可能很容易,因为下一次主循环迭代可能只会导致另一次ssl_-READ.但是如果ssl_read return想要_WRITE,那么应该用什么参数来调用它呢?为什么图书馆不自己发出这个电话?

如果服务器想要向客户端发送一些数据,它将使用ssl_write.再说一次,如果WANT_READ或WANT_WRITE被返回,该怎么办?你能重复刚才调用的同一个调用来回答你的请求吗?如果返回了WANT_READ,是否应该返回主循环,让select/poll/epoll处理这个问题?但首先应该写的信息呢?

还是应该在写入失败后立即进行读取?那么,当真正的解析器位于主循环中时,有什么可以防止从应用程序协议读取字节,然后不得不在应用程序外围的某个地方处理它呢?

推荐答案

对于非阻塞插座,SSL_WANT_READ表示"wait for the socket to be readable, then call this function again.";相反,SSL_WANT_WRITE意味着"wait for the socket to be writeable, then call this function again.".你可以通过SSL_read()SSL_write()电话拨打SSL_WANT_WRITESSL_WANT_READ.

Linux相关问答推荐

如何根据具体情况打印两行输出?

在新环境中使用Unicode范围的sed表达式有问题

Bash:将多行转换为单行的命令

将十六进制文件名转换为十进制

Perl/cpan: 找不到 JSON/Parse.pm @INC

如何在 ERE 中结束这个正则表达式

Qt会泄漏内存吗?

为什么 perf stat 不计算 cycles:u 在 BIOS 中禁用超线程的 Broadwell CPU 上?

Rust unix 进程

判断指定名称的画面是否存在

如何在 Linux 上使用 Python 判断进程是否仍在运行?

Linux C程序:如何找到函数所属的库

哪个程序在给定任何文件的情况下创建一个 C 数组?

Bash 命令 :(){ :|:& };: 将产生进程导致内核死亡.你能解释一下语法吗?

在 Ubuntu 上运行自包含的 ASP.NET Core 应用程序

如何在 Linux 中命名线程?

如何通过 ssh 判断 ubuntu 服务器上是否存在 php 和 apache

以原子方式移动目录

os.walk 没有隐藏文件夹

UNIX `time` 命令对于基准测试是否足够准确?