2014-02-22 21 views
1

我一直在使用UDT庫的基於udp的協議來發送文件,我注意到send函數在阻塞模式下返回之前將數據發送到緩衝區。然而,發送函數似乎返回,而不是在阻塞模式下發送整個數據(send()返回發送的數據量)。如果這個概率不能解決,那麼這個概率有什麼可能的原因,以及如何發送剩餘的數據呢?我用tcp和udp的winsock庫,但我沒有得到tcp或udp發送的這個概率(類似udt的功能)。測試所有的程序通過傳輸相同的文件&網絡。UDT send() - 如何保證發送整個緩衝區

int a; 
    if (UDT::ERROR == (a = UDT::send(*(UDTSOCKET*)sock, buffer, size, 0))) 
    { 
     cout << "send: " << UDT::getlasterror().getErrorMessage() << endl; 
     return -1; 
    } 
    else 
    { 
     return a; 
    } 
    This is the code i use. the value of 'a' is not the same as 'size' at times.      

我知道這會發生,如果它的非阻塞,但我使用阻塞發送無限超時。

+0

設置發送超時還是沒有?你真正的問題是什麼?爲什麼這是一個問題? –

回答

2

如果您設置了發送超時,則可能是超時。如果沒有,你可以認爲這是一個致命的連接錯誤。您可以撥打getlasterror來了解哪裏出了問題。

+0

感謝您的回答。我沒有設置發送超時。我將檢查getlasterror並嘗試查看出了什麼問題。 – kishore

+0

我試過使用getlasterror(),但沒有返回任何東西。遇到這個問題只適用於udt,不適用於tcp和udp。不知道這是怎麼發生的。我應該改變緩衝區大小還是事端? – kishore

+1

你是什麼意思「沒有回報我什麼」?你的意思是它返回了SUCCESS(0)?你應該可以再次調用[send](http://udt.sourceforge.net/udt4/doc/send.htm)來發送更多或者出錯。 –

-1

UDP數據報完整發送或根本不發送。你描述的情況是不可能的。請提供您的證據。

+0

我不認爲你理解他的問題。他談論的是UDP上的UDT,而不是UDP。 TCP數據包完全發送或根本不發送,但在應用程序級別,您不處理apck​​ets。 –

+0

@DavidSchwartz他正在談論send()函數,據我所知,不發送完整的數據報。這不會發生。讓我們看看證據。 – EJP

+0

不,他不是。他正在談論發送功能,而不是發送所有他要求的數據。他根本不是在談論數據報。它們是UDT的實現細節,就像它們與TCP一樣。它們在應用程序層不可見,因爲UDT隱藏它們,就像TCP一樣。 –