2012-03-30 29 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字符作为分隔符,或者你可以用它包含一个魔术和长度的头开始。