我正在使用BIO存儲器接口使TLS通過SCTP實現。如何使用內存BIO接口處理通過SCTP流傳輸的TLS的EAGAIN案例
所以在客戶端側,在發送出應用數據,
SSL_write()
API加密數據和所述相關聯的寫入BIO接口寫入數據。- 然後從BIO接口的數據讀入到使用
BIO_read()
呼叫,然後 - 發送到使用
sctp_sendmsg()
API套接字一個輸出緩衝區。 在服務器側
類似地,雖然從插座讀取數據
sctp_recvmsg()
API讀取來自插座ecrypted消息塊,BIO_write()
API將其寫入到讀取BIO緩衝器,和SSL_read()
api解密從BIO讀取的數據。
我感興趣的情況是在客戶端,步驟1和2完成,並在做3時,我從套接字獲得EAGAIN。因此,無論我從BIO緩衝區讀取的數據是什麼,我都會清理它,並要求應用程序在一段時間後重新發送數據。
現在,當我這樣做,後來當客戶端的步驟1,2和3經過罰款,在服務器端,openssl發現它收到的記錄已得到一個bad_record_mac並關閉連接。
從谷歌搜索我知道它的一個可能性是如果TLS數據包出現序列,因爲MAC編碼依賴於先前編碼的數據包,並且,TLS需要以相同的順序傳遞數據包。所以,當我清理EAGAIN上的數據時,我正在丟棄一個SSL數據包,然後發送一個亂序的數據包(這裏缺少清晰度)?
只是爲了確認我的假設,無論何時套接字返回EAGAIN,我將代碼更改爲無限等待,直到套接字可寫,然後一切正常,我沒有在服務器端看到任何bad_record_mac。
有人可以幫我在這裏處理這個EAGAIN嗎?我無法做出無限的等待來解決這個問題,還有沒有其他辦法?
非常好,我搞不清楚他在說什麼。 – EJP