簡體   English   中英

如何結合使用SSL_read和epoll?

[英]How to combine SSL_read and epoll?

我正在使用基於事件的網絡庫(使用epoll)編寫HTTP代理服務器。

假設有一個快速的HTTPS上游和一個緩慢的HTTP(S)下游。 因此,我必須將上游數據存儲到緩沖區,並在緩沖區已滿時從網絡庫中分離上游讀取事件。

但是眾所周知, SSL_read可能會部分返回數據。 因此,請考慮以下情況:

  1. 緩沖區大小為32並在網絡庫上附加讀取事件
  2. 上游發送32個字節, 整個HTTP消息為32個字節
  3. 網絡庫調用讀取事件回調
  4. 調用SSL_read(ssl, buf, 32)SSL_read返回16
  5. 向下游發送16個字節並在網絡庫上附加讀取事件
  6. 讀取回調將永遠不會被調用,因為剩余的16個字節位於openssl緩沖區中,並且上游沒有更多字節

那么有一個好的解決方案嗎?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM