2012-03-30 89 views
1

如果我一直向接收方發送數據,那麼發送的數據可能會重疊,使得它們在緩衝區中累積,因此下一次讀取緩衝區時也會讀取另一個已發送數據的數據?TCP數據能否在緩衝區中重疊

我正在使用Qt和readAll()來接收數據並對其進行解析。這個數據有一些結構,所以我可以知道數據是否已經完成,或者它是否是有效的數據,但是我擔心其他數據會與其他數據重疊,當我呼叫readAll(),並且因此會使這個假設 - 是有效的數據。

如果可能發生,我該如何預防/控制它?或者是OS/API所擔心的呢?我擔心的部分原因是該方法如何被調用。洛爾

+5

8個月18個問題** 0票**。移動。 – cnicutar 2012-03-30 06:13:42

+0

如果'readAll'破壞了它自己的緩衝區(你所描述的),那麼它就沒用了。 – Mat 2012-03-30 06:15:59

+0

我不確定這是什麼意思有一個損壞的緩衝區。我看到它的方式,它只是一個連續的內存線,隨着數據的進入而填滿。 – lightburst 2012-03-30 06:33:15

回答

0

根據http://qt-project.org/doc/qt-4.8/qiodevice.html#readAll此功能snarfs的所有數據並將其作爲一個數組。我不明白API如何引起對重疊數據的擔憂。該數組是通過值返回的,並且假定它代表整個流,那麼它甚至會與什麼重疊?您是否擔心返回的對象實際上具有引用語義(即它只保存指向存儲的指針,在其他調用相同函數時重用?)

如果發送緩衝區和接收緩衝區在任何系統中重疊,那就是錯誤,除非特別注意使用是完全序列化的。 (即,緩衝器被以某種方式僅用於發送和僅用於接收,而沒有任何的mixup。)

+0

不,我的意思是,如果我有一個發送者不斷髮送數據給接收者,當接收者讀取緩衝區時,接收者可能會遇到一些其他發送的數據,假設發送的數據是單獨的字符串,那麼string1會被接收者的字符串2讀取嗎? – lightburst 2012-03-30 06:25:22

+0

這聽起來像你描述的是一個定界/成幀問題,而不是「重疊」。流直到結束,所以string1和string2將在緩衝區中。 – Kaz 2012-03-30 08:01:51

0

爲什麼不使用固定長度的報頭,然後用頭部保持分組的長度的信息的可變長度數據包。

這樣可以避免擔心數據包邊界。例如說,而不是僅僅發送字符串發送字符串的長度和字符串。在接收端總是讀取長度,然後根據長度讀取字符串。

1

TCP是基於流的連接,而不是基於數據包的連接,因此您可能不會認爲一次發送的內容也會一次性接收。您仍然需要某種協議來打包流。

對於發送字符串,你可以使用NUL字符作爲分隔符,或者你可以用它包含一個魔術和長度的頭開始。