在 C++ 中设置SSL_read的连接超时
Set connection timeout for SSL_read in OpenSSL in C++
我正在开发一个与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
}
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 在 libcurl 连接池中预创建连接
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- libcurl 和 DNS ttl 中的内部连接管理
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- C++ 套接字 read() 有时在连接到服务器时返回 -1
- 为什么 read() 在管道连接到使用 boost::asio for STDIN/STDOUT 的程序时,使用 EAG