我正在开发一个与 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()
您可以按照与使用“普通”套接字相同的方式来执行此操作。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)
| 归档时间: |
|
| 查看次数: |
4276 次 |
| 最近记录: |