SSL_read的原型是:
int SSL_read(SSL *ssl, void *buf, int num);
open ssl的文檔這樣說:
SSL_read是工作在SSL/TLS的記錄之上的。數據按照記錄來接收的(最大記住是16KB SSLv3/TLS)。只有在一個記錄被完整接收之后才會被處理(解密和驗證)。因此SSL_read只會在記錄數據都讀取成功了才能返回數據,否則SSL_read只會觸發讀取下一個記錄組。如果num的數量比緩沖的數據量大,那么SSL_read會返回緩沖區的內容;如果緩沖區沒有內容,那么觸發讀取下個記錄。SSL_read最多返回的就是一個記錄的長度。由于SSL/TLS記錄的大小可能超過底層TCP包的大小,所以有可能需要讓SSL讀取多個TCP包,SSL_read才能成功。
從這段介紹來看,SSL_read可能返回失敗或者1到記錄大小。那么一個記錄到底實際有多大?
從我的測試來看,我調用返回從來沒有超過1024字節;難道OpenSSL為了性能改進盡量保證每個SSL_read能成功,自動將SSL記錄設置成小于TCP分組的大小?
另外測試當中還發現以下兩種情況:
1.當返回值小于1024的時候,SSL_errno等于0,errno也等于0
2.當傳遞的num等于0的時候,SSL_errno等于5,但這個時候不是表明連接被關閉了。
我用的操作系統是CentOS5.6,OpenSSL0.9.8r版本。
希望有類似經驗的大俠交流一下。