簡體   English   中英

當SSL_read()返回WANT_READ時調用SSL_write()

[英]Calling SSL_write() when SSL_read() returned WANT_READ

我正在使用將OpenSSL用於TLS且使用非阻塞I / O的客戶端應用程序。 連接的兩端都可以隨時寫入,表明狀態發生了某些變化。 因此,我需要定期檢查套接字以獲取新數據。 如果什么都沒收到,我的代碼應立即繼續下一個任務:將新數據從客戶端發送到服務器。

但是我不確定,如何使用OpenSSL-API進行此操作:在未接收到任何數據的套接字上調用SSL_read() (因為另一端未發送任何內容)始終會導致SSL_ERROR_WANT_READ的錯誤代碼(甚至在重新協商的情況下甚至SSL_ERROR_WANT_WRITE )。 在那種情況下,我可以繼續下一個任務並調用SSL_write()將其他數據寫入服務器嗎?

手冊頁中沒有詳細討論。 它只是提到重復讀調用的參數必須與以前完全相同。 Viega等着《 使用OpenSSL進行網絡安全 》一書。 包含一個非阻塞I / O的示例。 但是作者等待SSL_read()成功(讀取1個或更多字節),然后才調用SSL_write()將數據發送到另一側,這意味着直到接收到另一側的數據后,才可以進行寫操作。 對我來說,這是行不通的。

簡而言之:如果SSL_read()返回帶有SSL_ERROR_WANT_WRITESSL_ERROR_WANT_READ信息,那么在重復讀取之前,我可以僅將SSL_write()與其他數據一起調用嗎? 如果沒有,我該如何實現“讀取並可用”的東西?

SSL_ERROR_WANT_WRITESSL_ERROR_WANT_READ不一定表示錯誤情況。 它表示為了繼續進行,必須先完成讀或寫操作。

因此,如果您的SSL_read返回其中之一。 如果您必須等待條件得到滿足,則只需提及的書中的示例即可。 在此之前,調用包括SSL_write在內的任何其他SSL API SSL_write無效。

也許,您可以使用/ select / poll / epoll(如果不使用)或其他方法來了解套接字上的任何網絡活動

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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