我在Linux上使用OpenSSL 1.0.0-fips。我遇到的問題是SSL_connect()
正在返回-1,而SSL_get_error()
正在返回SSL_ERROR_WANT_READ
。然後我把文件描述符放入select()
,timeval
結構設置爲10秒,select()
剛剛超時。使用OpenSSL BIO的非阻塞I/O
我解僱了Wireshark,我看到「Client Hello」出來,我看到ServerHello
回到客戶端,但它從未在select()
中「醒來」。它只是超時。
我的問題是:
我必須使用
BIO_new_socket()
創建BIO對象,然後用SSL_set_bio()
的BIO對象分配給我的SSL對象?SSL_set_fd()
的手冊頁說它會自動創建一個BIO對象,這似乎意味着SSL_set_bio()
是一種無用的函數,你永遠不需要調用它。讓我們假設我們使用
SSL_set_fd()
並分配一個阻塞的連接的TCP文件描述符。假設我們稍後使用fcntl()
將該文件描述符更改爲非阻塞。這是否會破壞SSL對象(或底層的BIO對象)?
您應該可能會顯示一些代碼,包括如何設置上下文。異步I/O和非阻塞套接字給人們帶來了相當多的麻煩,因爲庫不太適應。查看['apps/ocsp.c'](https://github.com/openssl/openssl/blob/master/apps/ocsp.c)的源代碼,瞭解OpenSSL如何實現它。我似乎想起正常的上下文是在阻塞模式下設置的,然後使用底層套接字切換到非阻塞模式。搜索調用「BIO_get_fd」和「select」的代碼。 AFAIK,它是自我記錄代碼中非阻塞I/O的唯一例子:) – jww
我沒有發佈代碼,因爲我實現的C++ SSL Socket類的整個連接函數非常大。但是,我發現我的問題。我忘記將1添加到select()的maxfd參數。 –