gpt4 book ai didi

sockets - TCP 套接字读取不带帧或大小指示符的可变长度数据

转载 作者:可可西里 更新时间:2023-11-01 02:49:31 27 4
gpt4 key购买 nike

我目前正在编写代码以将数据传输到远程供应商。传输将通过 TCP 套接字进行。我遇到的问题是数据是可变长度的,并且没有框架或大小标记。发送数据没有问题,但我不确定处理返回数据的最佳方式。

数据由不同的“消息”组成,但它们没有固定的大小。每条消息都有一个 8 或 16 字节的位图,指示该消息中包含哪些组件。有些组件是固定长度的,有些是可变的。每个可变长度组件都有一个用于整个消息的该部分的大小前缀。

当我第一次打开套接字时,我将发送消息,每个消息都应该收到响应。当我开始读取数据时,我应该位于消息的开头。我将需要解释位图以了解包含哪些消息字段。当数据到达时,我将必须验证位图指示的每个字段是否存在且大小正确。

一旦我读完了第一条消息,下一条消息就开始了。我担心的是,如果传输在一条消息中途中断,我该如何恢复并正确找到下一条消息的开始?

我将不得不模拟连接失败,我的代码需要在取消该消息之前自动重试一定次数。

我无法控制远程端的代码,也无法将帧字节或大小前缀添加到消息中。

我们欢迎最佳实践、设计模式或有关处理此问题的最佳方法的想法。

最佳答案

从用户的角度来看,TCP 是一个数据流,就像您可能通过串行端口接收数据一样。没有数据包,也没有标记。

非阻塞读取/接收调用将返回当前到达的内容,您可以在该点解析它。如果在解析时,您在到达消息末尾之前用完了数据,请读取/接收更多数据并继续解析。冲洗。重复。请注意,如果另一条消息紧随其后,您可能会获得比特定消息所需的更多字节。

TCP 流不会丢失或重新排序字节。消息不会被截断,除非连接断开或发件人有错误(例如,只能写入/发送部分,然后从未尝试写入/发送其余部分)。您无法继续中断的 TCP 流。您只能打开一个新的并重新开始。

关于sockets - TCP 套接字读取不带帧或大小指示符的可变长度数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12691759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com