2011-07-22 25 views
3

我打算通過套接字接收數據包,但因爲它們是從發送方用高頻派出了一些人得到打包成一個單一的byte陣列。即使它們是分別發送的(使用wireshark進行驗證),它仍然保存多個數據包。插座ReceiveAsync合併包

我已經嘗試排隊進入的數據包和異步工作他們,但我仍然得到同樣的結果。

可能是什麼原因,這種行爲?

回答

7

這是TCP的工作原理。 TCP連接是一個雙向字節流,你必須這樣對待它。單次從一端發送可能會導致接收端發生多次讀取,反之亦然,多次發送可能會以單次讀取結束,並且應用程序消息邊界不會由傳輸保留。

你,直到你知道你有一個完整的應用程序消息緩衝輸入。常見的方法是:

  • 固定長度的消息,在該消息的前
  • 預先待決的長度,
  • 界定與特殊的「結束消息」分離器中的流。
+0

恰恰是這樣,TCP是一個流協議(字節流 - 不是數據包 - 由應用程序使用)。 UDP是數據報協議(離散數據包) –

+0

我使用的協議是使用Newline結尾作爲分隔符。但是,也有一些消息在他們的數據中有新行 - 我該如何區分它們? – korve

+0

嗯,嘗試一些不可打印的字符,如'\ 001'(FIX字段分隔符)或其他數據中不包含*的*,來分隔消息。 –

-3

我可能會誤以爲,但是這不就是Naggle算法踢? 您的套接字應該有一個禁用此功能的標誌。

+1

不,不是這樣的。 TCP是一個流。期望在每個讀取的1個字節和最小提供的緩衝區大小以及未完成字節數之間的任何位置接收數據。如果數據是通過一個或多個發送呼叫發送的,則無關緊要。禁用nagle將無濟於事;儘管它似乎有所幫助。 (-1) –