2012-10-31 109 views
5

我已經寫了一個使用OpenSSL API與一臺SSL服務器交互的SSL客戶端。在OpenSSL站點中,我瞭解到寫入一些數據後需要刷新寫入緩衝區。我在客戶端程序中使用SSL_Write和SSL_Read。由於OpenSSL網站建議我嘗試使用BIO_flush(BIO *)刷新數據,因此我在這裏崩潰。有沒有什麼辦法刷新SSL寫緩衝區

我使用的是SSL庫從this site

這裏有我不清楚是否BIO_flush閃爍讀緩存或寫緩衝區.. :-( 所以我只是想知道有沒有其他的方法來刷新SSL寫緩衝區...?

這裏是我的客戶端程序的細節。

  1. 創建使用SSL_new
  2. 克雷亞SSL對象(MSSL)廷TCP套接字並與服務器
  3. 創建使用BIO_new_socket BIO對象(姆比奧)使得連接(socket_id,BIO_NOCLOSE)
  4. 設置使用SSL_set_bio(MSSL,姆比奧,姆比奧)的BIO對象到SSL對象;
  5. 使用SSL_set_fd(mSsl,socket_id)將套接字設置爲SSL對象;
  6. 使用SSL_Connect(mSsl)與服務器建立SSL連接;

上述步驟後,我開始兩個單獨的線程進行寫入和讀取。寫入線程使用SSL_write將數據寫入服務器,讀取線程使用SSL_Read從服務器讀取數據。

在使用SSL_Write寫入每個數據包之後寫入線程我正在調用BIO_flush(mBio)。

在整個程序中,我只是在這個地方直接使用mBio對象來做生物緩衝區刷新。

當我開始發送一些數據包,程序崩潰在BIO_flush ...按照轉儲說,它在BIO_ctrl功能。我沒有得到任何更多的東西。

有沒有人使用過我提供的鏈接庫,並面臨同樣的問題..?如果是,請告訴我,如果你知道解決方案。

是否有任何線程同步規則使用BIO_flush()...?我的意思是撥打BIO_flush SSL_Read不應該在同一時間發生......?

回答

2

BIO_flush用於刷新寫入數據。

BIO_flush和SSL_read/write的組合和匹配是有問題的,因爲BIO結構不知道您的SSL_read/write調用。

使用BIO_read/write可以獲得更好的結果。

如果你絕對需要使用SSL_read/write,你應該避免使用BIO。

我想你會在這個OpenSSL文檔結尾的例子中得到更多的幫助。

Simple OpenSSL Client Example

如果你想這個例子,當有人還在崩潰,你可能會具有打造您正在使用的特定庫的問題。

6

你從哪裏知道寫入緩衝區後需要刷新?

我也在尋找刷新功能,但找不到一個。

我認爲它的工作原理是這樣的:每次調用SSL_write都會產生至少一個SSL記錄,並將其發送到套接字,其中的nagle算法可能會在內核中緩存一段時間,然後將其快速提交到外部。

因此,SSL_write中沒有緩衝區,因此不需要刷新!

我寧願有一個刷新功能,並將所有SSL記錄填充到邊緣,但根據我的理解,這是不可用的。我現在打算做我自己的緩衝,並儘可能地對SSL_write進行大量調用。

順便說一句:我只是寫了一個小測試程序:它發送一個緩衝區寫一個然後我再次運行它,爲每個字符調用SSL_write。兩次我運行tcpdump,在Wireshark中,我可以看到第一次運行的應用程序數據記錄很少,第二次運行的記錄很多。所以我認爲這是確認。

相關問題