如果我继续向接收器发送数据,发送的数据是否可能重叠,以便它们在缓冲区中累积,因此下一次读取缓冲区也会读取另一个发送数据的数据?
我正在使用Qt和readAll()
来接收数据并解析它。这个数据有一些结构,所以我可以知道数据是否已经完成或者它是否是有效的数据但我担心当我调用readAll()
时其他数据会与其他数据重叠,因此会使此无效假设有效数据。
如果可能发生,我该如何预防/控制它?或者是OS / API担心的事情呢?我担心的部分原因是该方法的调用方式。洛尔
答案 0 :(得分:1)
TCP是基于流的连接,而不是基于数据包的连接,因此您可能不会假设一次也会收到一次发送的内容。您仍然需要某种协议来打包您的流。
对于发送字符串,您可以使用nul-character作为分隔符,或者您可以从包含魔术和长度的标题开始。
答案 1 :(得分:0)
根据http://qt-project.org/doc/qt-4.8/qiodevice.html#readAll,此函数会对所有数据进行snarfs并将其作为数组返回。我没有看到API如何引起对重叠数据的担忧。数组是按值返回的,并且假定它代表整个流,那么它甚至会与什么重叠?您是否担心返回的对象实际上具有引用语义(即它只保存指向存储的指针,该存储在对同一函数的其他调用中重用?)
如果发送和接收缓冲区在任何系统中重叠,那就是一个错误,除非特别注意使用是完全序列化的。 (即,缓冲区以某种方式仅用于发送,仅用于接收,没有任何混淆。)
答案 2 :(得分:0)
为什么不使用固定长度的标头,后跟可变长度数据包,标头包含数据包长度信息。
这样您就可以避免担心数据包边界。比如说,而不是只发送字符串发送字符串后跟字符串的长度。在接收端,始终读取长度,然后根据读取字符串的长度。