2011-03-25 63 views
1

libssh2_channel_write_ex手冊頁:行爲當信道沒有阻止

寫入的實際字節數或 負上失敗。 LIBSSH2_ERROR_EAGAIN當它會 否則阻止。雖然 LIBSSH2_ERROR_EAGAIN是一個負數 號碼,但它不是真的每 se失敗。

現在我有一個問題。當我收到LIBSSH2_ERROR_EAGAIN這是否意味着什麼都沒有發送,我必須重新發送所有數據?或這是否意味着一些數據已發送

我的問題是,如果我試圖發送更多的數據,底層套接字可以容納,write()應該阻止,因此我希望如何發送一大塊數據沒有得到LIBSSH2_ERROR_EAGAIN每次?

+0

您是否能以'setsockopt的(2)'插座上'SO_SNDBUF'要發送的數據的大塊過嗎? – sarnold 2011-03-25 10:51:47

+0

@sarnold:其實我並沒有試圖發送大量的數據,但是我一次就在幾個開放的頻道上發送數據。你的意思是我應該確保所有通道緩衝區大小的總和應該小於底層套接字緩衝區大小? – kriss 2011-03-25 11:23:41

+0

我認爲如果你試圖填充一個內核發送緩衝區(例如'write(2)'將返回一個小於你傳遞的緩衝區的長度的值),你應該只是簡短地寫一次,所以它應該全部「只是工作「,如果你已經寫了你的代碼來準備潛在的短文寫作。但是我以前從來沒有使用過libssh2庫,並且我沒有足夠的信心去說明它會做什麼。 :)我只是想,如果你知道你要發送的最大塊是32k,那麼確保緩衝區足夠大,以便在一個'write(2)'中處理它。 – sarnold 2011-03-25 11:39:53

回答

1

LIBSSH2_ERROR_EAGAIN表示沒有發送任何內容,您必須重新發送。如果發送了,則將返回該號碼。

1

LIBSSH2_ERROR_EAGAIN如果沒有數據已發送到緩衝區,將發生。您可以在使用Select()檢查套接字是否有效之後再次發送它。 如果Select()返回該事件,則可以正確處理它,並且可以重新發送它。

循環是這樣

do 
    { 
    While (rc = libssh2_Channel_write_ex() == LIBSSH2_ERROR_AGAIN) 
    { 
     if(!select()) // Wait for timeout 
     //Timeout 
    } 
    if(rc>0) 
     //Read next set of data into buffer for sending 
    else if(rc <0) 
     // Libssh2 error 
    } 
相關問題