2016-02-13 51 views
0

我想爲我多年前寫的舊聊天應用程序添加一個ssl支持。我在OpenSSL和LibreSSL上做了大量的閱讀,並決定嘗試一個新的libtls API。我認爲開發人員在這個方面做得非常出色。 我發現它非常易於使用 - 幾乎不需要對現有代碼進行更改。但現在我需要弄清楚一件事:libtls:select()和tls_read()一起工作

早在一天中,我就使用select()來監視套接字並使用recv()來讀取數據。這很容易,因爲這兩個函數都在處理文件描述符。

現在,在libtls中,函數tls_read()需要tls上下文作爲第一個參數。這意味着我需要在每次準備好讀取描述符時搜索客戶端列表以獲取適當的tls上下文。這並不難,但也許有人知道更好的解決方案?我會欣賞所有評論和代碼示例。

+0

請分享一些代碼和一個明確的問題。 http://stackoverflow.com/help/how-to-ask – bibi

回答

0

除非我誤讀了文件,在我看來,如果你自己創建的插座,然後用tls_connect_fds/tls_connect_socket/tls_accept_fds/tls_accept_socket之後,你就會有正常可用的文件句柄,你可以平凡與select()使用/ poll() /等。一旦你準備好了,你仍然需要保留某種文件描述符到上下文的映射來實際發佈tls_read/tls_write,但這只是你選擇的鏈表或散列表,這取決於你使用的是什麼語言和stdlib你有空。

+0

你能否引用說明文檔?我很懷疑,因爲我所使用的每個SSL/TLS實現都有一種方法來檢查是否存在被TLS層緩衝的解碼字節,不再由poll()或select()報告。可以使用SSL_pending(OpenSSL),gnutls_record_check_pending(GNU TLS),SSLGetBufferedReadSize(OSX Secure Transport)來檢查這些問題。 mbedTLS不提供一種友好的方式來檢查;一個解決方法是嘗試讀取一個字節,然後將其存儲直到下一次讀取。 –