[英]How to combine SSL_read and epoll?
我正在使用基於事件的網絡庫(使用epoll)編寫HTTP代理服務器。
假設有一個快速的HTTPS上游和一個緩慢的HTTP(S)下游。 因此,我必須將上游數據存儲到緩沖區,並在緩沖區已滿時從網絡庫中分離上游讀取事件。
但是眾所周知, SSL_read
可能會部分返回數據。 因此,請考慮以下情況:
32
並在網絡庫上附加讀取事件 32
個字節, 整個HTTP消息為32
個字節 SSL_read(ssl, buf, 32)
和SSL_read
返回16
16
個字節並在網絡庫上附加讀取事件 那么有一個好的解決方案嗎?
OpenSSL的較舊的基於SSL的API不遵循您嘗試使用的傳統套接字I / O事件模型。
使用非阻塞套接字時,不應在調用SSL_read()
之前等待套接字讀取事件。 您應該無條件調用SSL_read()
並通過返回SSL_ERROR_WANT_READ
錯誤讓它告訴您何時需要從套接字獲取更多數據。 只有這樣,您才應該在再次調用SSL_read()
之前等待套接字讀取事件(如果它返回SSL_ERROR_WANT_WRITE
,則等待套接字寫入事件SSL_read()
。
如果您想使用傳統的套接字事件來驅動您的讀取/寫入,請改用OpenSSL的較新的基於BIO的API。 使用BIO對將接收到的加密字節推送到OpenSSL引擎中,讓它在讀取時將解密的字節推送給您,在發送時反之亦然。 然后,您可以根據需要處理套接字I / O。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.