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