gpt4 book ai didi

c++ - 调用 SSL_Read 时阻塞

转载 作者:行者123 更新时间:2023-12-04 19:35:44 26 4
gpt4 key购买 nike

当前的 OpenSSL 版本是 1.1.1d。
我正在使用 SSL 到 TCP 套接字。
以下是相关来源。

...
...

struct timeval tv;
fd_set fdIn;

tv.tv_sec = 0;
tv.tv_usec = 10000;

FD_ZERO(&fdIn);

if ( SocketId > 0 ) {
FD_SET( SocketId, &fdIn );
}

int retVal {0}, nflag {0};

while((retVal = select(FD_SETSIZE, &fdIn, nullptr, nullptr, &tv)) == -1
&& (errno == EINTR)) {
.. TODO

}

if ( SocketId > 0 && FD_ISSET( SocketId, &fdIn ) ) {
// This...
int s = SSL_read(pSSL, pbuf, size);
}

...
...
源按预期运行。
但是从1.1.1g编译使用后就出现了问题。
调用 SSL_Read 方法会导致阻塞几秒钟。
已编译 OpenSSL 库。
编译时是否需要指定其他选项?
PS.在 CentOS 7 中测试。

最佳答案

Invoking the method SSL_Read causes blocking for a few seconds.


这并不少见。一般 SSL_readSSL_write不能与 select 一起使用与普通 read 一样和 write可。以前的 OpenSSL 版本已经存在这种情况,但现在使用 OpenSSL 1.1.1 处理 TLS 1.3 session 的情况更多,因为票证是在 TLS 握手完成后发送的。
一般 SSL_readSSL_write需要与非阻塞套接字一起使用,结果需要检查 SSL_WANT_READSSL_WANT_WRITE - 并且需要根据这些“错误”采取行动。这是因为 SSL 读取可能需要内部写入,而 SSL 写入可能需要内部读取。另外 SSL_pending除了 select还需要使用因为可能是来自先前 SSL 帧的数据在本地 SSL 对象和 select 中仍未读取。只关心套接字而不关心内部缓冲区。

关于c++ - 调用 SSL_Read 时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64218815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com