首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

openssl ssl_connect永远阻止 - 如何设置超时?

这个问题是关于OpenSSL库中的ssl_connect函数,该函数在TLS/SSL握手过程中阻塞了程序。用户希望了解如何设置超时来避免程序长时间阻塞。

首先,我们需要了解ssl_connect函数的基本用法。ssl_connect函数用于建立TLS/SSL连接。它接受一个SSL对象作为参数,并在连接建立成功后返回1。如果连接建立失败,它将返回一个负数。

要设置超时,我们可以使用select函数来监控文件描述符的状态。我们可以将超时设置为一个特定的时间,例如10秒。在超时时间内,如果文件描述符变为可写,则表示连接已经建立。如果超时时间内文件描述符未变为可写,则表示连接建立失败。

以下是一个示例代码,展示了如何使用select函数设置超时:

代码语言:c
复制
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include<openssl/ssl.h>

int ssl_connect_with_timeout(SSL *ssl, int timeout_seconds) {
    fd_set readfds, writefds;
    struct timeval timeout;
    int ret;

    FD_ZERO(&readfds);
    FD_ZERO(&writefds);
    FD_SET(SSL_get_fd(ssl), &readfds);
    FD_SET(SSL_get_fd(ssl), &writefds);

    timeout.tv_sec = timeout_seconds;
    timeout.tv_usec = 0;

    ret = select(SSL_get_fd(ssl) + 1, &readfds, &writefds, NULL, &timeout);
    if (ret == 0) {
        // 超时
        return -1;
    } else if (ret < 0) {
        // 错误
        return -2;
    }

    // 连接建立
    return ssl_connect(ssl);
}

在这个示例代码中,我们使用select函数监控文件描述符,并设置超时时间为10秒。如果超时时间内文件描述符未变为可写,则返回-1表示超时。如果连接建立成功,则返回1。

请注意,这个示例代码仅用于演示目的,实际应用中可能需要根据具体情况进行调整。

总之,要设置超时,我们可以使用select函数监控文件描述符的状态,并在超时时间内检查文件描述符是否变为可写。如果文件描述符未变为可写,则表示连接建立失败。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

14分54秒

最近我收到了 SAP 上海研究院一个部门领导的邀请,参加了一个信息素养故事分享会。我也就"如何快速上

领券