插座功能如send
和receive
可以被信號中斷。由於這個需要一些額外的代碼,例如檢查errno == EINTR
。這在相應的手冊頁中描述。OpenSSL和信號
我不知道在使用OpenSSL函數時這是如何工作的,例如, SSL_write
,SSL_read
。他們的手冊並沒有提到有關信號的任何信息。我也試圖谷歌這一點,但沒有運氣。你知道OpenSSL是否在內部處理信號,或者需要一些額外的代碼?如果是,如何檢查函數調用是否被信號中斷?
更新:
看起來OpenSSL的那個不處理重試。它只設置BIO對象上的「應該重試」標誌。所以,我需要使用這樣的事情,如果通話被中斷,並且需要重試檢測:
int result = SSL_write(ssl, buff, length);
if ((result < 0) && BIO_should_retry(SSL_get_wbio(ssl)))
// need to retry
int result = SSL_read(ssl, buff, length);
if ((result < 0) && BIO_should_retry(SSL_get_rbio(ssl)))
// need to retry