首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞BIO_do_connect在未连接互联网时被阻止

非阻塞BIO_do_connect在未连接互联网时被阻止
EN

Stack Overflow用户
提问于 2016-08-11 11:10:21
回答 2查看 596关注 0票数 3

我使用Openssl-0.9.8x,如下所示:

代码语言:javascript
复制
bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, & ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_nbio(bio, 1);
in_addr_t serverIP =  inet_addr(HTTPS_SERVER_IP);
BIO_set_conn_ip(bio, &serverIP );
BIO_set_conn_port(bio, HTTPS_SERVER_PORT_STR);
while(1) {
    printf("BIO_do_connect start>>>>\n");
    if(BIO_do_connect(bio) <= 0 && BIO_should_retry(bio)) {
        sleep(1);
        printf("BIO_do_connect retry>>>>\n");
    }
    else {
        printf("Connect success.\n");
    }
}

当互联网连接正常(即它可以连接到服务器)时,它工作得很好。但是,当互联网连接受到限制(即无法连接到服务器)时,BIO_do_connect()会在一次或多次重试后被阻止。输出如下:

代码语言:javascript
复制
BIO_do_connect start>>>>
BIO_do_connect retry>>>>
BIO_do_connect start>>>>
BIO_do_connect retry>>>>
BIO_do_connect start>>>>

最后,它在BIO_do_connect(...)中被阻塞?为什么会发生这种情况?

EN

回答 2

Stack Overflow用户

发布于 2016-08-11 17:08:08

这可能是因为您使用了SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY)

从0.9.8手册页:

SSL_MODE_AUTO_RETRY

如果传输阻塞,请不要用重试来打扰应用程序。如果在正常操作期间发生重新协商,则SSL_read()或SSL_write()将返回-1,并指示需要使用SSL_ERROR_WANT_READ重试。在非阻塞环境中,应用程序必须准备好处理不完整的读/写操作。在阻塞环境中,应用程序并不总是准备好处理没有成功报告而返回的读/写操作。标志SSL_MODE_AUTO_RETRY将使读/写操作仅在握手和成功完成之后返回。

SSL_MODE_AUTO_RETRY的作用是自动重试原本会返回应用程序代码的操作(即使在使用阻塞连接时也是如此)。当你想要非阻塞操作时,使用它没有任何意义。

尝试完全删除该行。

顺便说一句,0.9.8不再受支持,不再接收安全更新。你真的应该升级到更新的版本。

票数 1
EN

Stack Overflow用户

发布于 2016-08-11 13:39:30

添加以下内容:

代码语言:javascript
复制
in_addr_t serverIP =  inet_addr(HTTPS_SERVER_IP);
BIO_set_conn_ip(bio, &serverIP );
BIO_set_conn_port(bio, HTTPS_SERVER_PORT_STR);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38886648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档