缓冲区中的TCP数据是否可以重叠
Can TCP data overlap in the buffer
如果我一直向接收器发送数据,发送的数据是否可能重叠,从而在缓冲区中累积,因此对缓冲区的下一次读取也会读取另一个发送数据的数据?
我使用Qt和readAll()
来接收数据并解析它。这个数据中有一些结构,所以我可以知道数据是否已经完整,或者它是否是有效的数据,但我担心当我调用readAll()
时,其他数据会与其他数据重叠,因此会使这个假设为有效数据的数据无效。
如果它可能发生,我该如何预防/控制它?或者这是OS/neneneba API所担心的吗?我之所以担心,部分原因是该方法的调用方式。lol
TCP是基于流的连接,而不是基于数据包的连接,因此您可能不会认为一次发送的内容也会在一次内接收。您仍然需要某种协议来打包流。
对于发送字符串,可以使用nul字符作为分隔符,也可以以包含魔术和长度的标头开头。
根据http://qt-project.org/doc/qt-4.8/qiodevice.html#readAll此函数捕获所有数据并将其作为数组返回。我看不出API是如何引起对重叠数据的关注的。数组是按值返回的,如果它表示整个流,那么它会与什么重叠呢?您是否担心返回的对象实际上具有引用语义(即,它只保存指向在对同一函数的其他调用中重复使用的存储的指针?)
如果在任何系统中发送和接收缓冲区重叠,那就是一个错误,除非特别注意使用是完全序列化的。(也就是说,缓冲区在某种程度上只用于发送和接收,而没有任何混淆。)
为什么不使用固定长度的标头,然后是可变长度的数据包,标头包含数据包的长度信息。
这样就可以避免对数据包边界的担忧。例如,不要只发送字符串,而是先发送字符串的长度,然后再发送字符串。在接收端总是读取长度,然后根据长度读取字符串。
- 在提升multi_index容器中,是否定义了"default index"?
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在c/c++中检查两个任意内存范围是否重叠
- 是否有快捷方式重叠运算符?
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 如何检查 n 个给定的磁贴中是否有任何重叠
- Xlib.检查窗口是否重叠
- 检查两个矩形是否重叠或边缘是否接触
- 测试方形是否与 C++ 中带有 DirectX 的多边形重叠(可选)
- std::copy_n 是否适用于重叠范围?
- 在读取期间,非重叠串行端口连接是否会阻止写入(反之亦然)
- 如何在c++中检查两个或多个时间段是否重叠
- 是否允许 memcpy 的 src 和 dest 参数重叠
- 缓冲区中的TCP数据是否可以重叠
- malloc()是否可以分配一个与使用mmap()分配的另一个缓冲区重叠的缓冲区
- 是否可以有效地计数与数字线上的单个点P重叠的线段的数量
- 存储一组不重叠的范围,并严格查找一个值是否存在于任何一个范围中
- 如何确定一组矩形是否包含两个重叠区域
- 在小于0 (N)的时间内找出点是否在N个(可能重叠)矩形中的一个内
- Qt:是否允许非矩形QWidget重叠