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

4dc9hkyq  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(437)

我正在开发一个与OpenSSL通信的Linux应用程序。我目前正在运行一些健壮性测试,其中一个让我很难。
当我的程序正在下载一个大文件时,我拔掉了以太网电缆,我希望它在30秒后停止,例如。但它从未停止。
我使用SSL_read,这是它阻塞的地方:

count = SSL_read(ssl, buffer, BUFSIZE);

是否可以为SSL_read设置超时?
我试过SSL_CTX_set_timeout(),但它不工作。我还看到它可能可以使用select(),但我不知道如何使用它与SSL_read()

4c8rllxm

4c8rllxm1#

你可以用和“普通”套接字一样的方法来做。基本上,你在一个传递给ssl的套接字上设置timeval,如果没有收到任何东西,那么当timeval中设置的时间过去时,SSL_read将返回-1。下面的例子(不感兴趣的部分用pseudo编写):

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

相关问题