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

Fra*_*ois 5 c++ ssl timeout

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

当我的程序正在下载一个大文件时,我会拔掉以太网电缆,并且我希望它在 30 秒后停止。但它永远不会停止。

我使用 SSL_read 这就是它阻塞的地方:

count = SSL_read(ssl, buffer, BUFSIZE);
Run Code Online (Sandbox Code Playgroud)

是否可以为 SSL_read 设置超时?

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

Dre*_*ejc 2

您可以按照与使用“普通”套接字相同的方式来执行此操作。timeval基本上,您在传递给 ssl 的套接字上设置,如果没有收到任何内容,则SSL_read当设置的时间通过时, 将会返回 -1 。timeval下面的例子(无趣的部分是用伪写的):

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
Run Code Online (Sandbox Code Playgroud)

编辑

要检查是否超时,请像这样:

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
Run Code Online (Sandbox Code Playgroud)