在 C++ 中设置SSL_read的连接超时

Set connection timeout for SSL_read in OpenSSL in C++

本文关键字:read 连接 超时 SSL C++ 设置      更新时间:2023-10-16

我正在开发一个与OpenSSL通信的linux应用程序。我目前正在进行一些稳健性测试,其中一个让我很难过。

例如,当我

的程序正在下载一个大文件时,我拔掉以太网电缆,我希望它在 30 秒后停止。但它从未停止。

我使用SSL_read,这是它阻止的地方:

count = SSL_read(ssl, buffer, BUFSIZE);

是否可以将超时设置为 SSL_read?

我已经尝试过SSL_CTX_set_timeout()但它不起作用。我也看到也许可以使用select()但我不明白如何使用它SSL_read()

您可以像

使用"普通"套接字一样执行此操作。基本上,您将timeval设置在传递给 SSL 的套接字上,如果未收到任何内容,则当以 timeval 为单位设置的时间过去时,SSL_read将返回 -1。下面的示例(不有趣的部分是用伪写的(:

struct timeval tv;
char buffer[1024];
// socket, bind, listen, ... 
// accept 
int new_fd = accept(...)
tv.tv_sec = 5; // 5 seconds
tv.tv_usec = 0;
setsockopt(new_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// assign fd to ssl ...
//  blocking method will return -1 if nothing is received after 5 seconds
int cnt = SSL_read(ssl, buffer, sizeof buffer);
if (cnt == -1) return; // connection error or timeout

编辑

要检查它是否超时,请执行以下操作:

int ssl_error = SSL_get_error(ssl, cnt);
if (ssl_error == SSL_ERROR_SYSCALL) {
    printf("SSL_read failed with errno: %d", errno);
    if (errno == EAGAIN || errno == EWOULDBLOCK) {
        printf("Timeout");
    } else {
        // Other socket errors
    }
} else {
    // Other SSL errors
}