簡體   English   中英

當沒有連接互聯網時,非阻塞BIO_do_connect被阻止

[英]nonblocking BIO_do_connect blocked when there is no internet connected

我使用Openssl-0.9.8x如下:

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()會在重試一次或多次后被阻止。 輸出如下:

BIO_do_connect start>>>>
BIO_do_connect retry>>>>
BIO_do_connect start>>>>
BIO_do_connect retry>>>>
BIO_do_connect start>>>>

最后,它在BIO_do_connect(...)被阻止了? 為什么會這樣?

可能是您使用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不受支持,不再接收安全更新。 你真的應該升級到更新的版本。

添加以下內容:

in_addr_t serverIP =  inet_addr(HTTPS_SERVER_IP);
BIO_set_conn_ip(bio, &serverIP );
BIO_set_conn_port(bio, HTTPS_SERVER_PORT_STR);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM