我想通过TCP发送大量缓冲区(从100MB到1GB)。我通过将缓冲区分成较小的(大约1MB缓冲区)并通过socket.send()发送来解决它。每次调用socket.send()方法,发送打包在特定结构中的部分数据(较小的缓冲区):[start byte(1B),Timestamp(4B),Command(4B),data of length(4B),Data to send (?B),CRC(1B),结束字节(1B)]。当特定端口只发送一个巨大的缓冲区时,一切正常。但是当我尝试使用相同的TCP端口同时向另一个数据(非常小,例如20个字节)发送缓冲区时,则TCP在缓冲区中混合数据并且不再能够解码缓冲区。 '开始字节'和'结束字节'在缓冲区中查找缓冲区的开始和结束没有用,因为这些字节很可能出现在数据中。
编辑:问题不会影响软件包之间的顺序或ID,但会影响软件包中的字节数。一开始一切正常,每个缓冲区都被正确解码。一段时间后,无法解码缓冲区,因为它包含不正确的数据。看起来缓冲区中的字节被移动或更改。缓冲区开头的字段(时间戳,命令,长度)包含不可能的值。因此,当我想获得已发送数据的长度时,我得到了值类似于-1534501133而不是1048556(1048556是一个包中发送数据的正确最大大小)。它是随机发生的,但总是与发送较小的独立缓冲区的时刻相关联。附加信息是,使用定时器重复发送较小的缓冲区,并且问题发生在随机时刻。有时甚至可以毫无问题地发送整个数据(例如300 MB),但很少发生。
我希望,我已经足够清楚地描述了它。
您对如何避免此问题有任何建议吗?
答案 0 :(得分:0)
使用唯一ID标记您的数据,以便您知道哪些数据与哪些消息相关。另外,将数据包标头与数据包有效负载分开。
所以,你的第一个请求是[ID] [PACKETTYPE] [TIME] [命令] [LENGTH] [CRC]
第二个是[ID] [PACKETTYPE] [DATA]
然后,您可以将ID与数据包类型进行匹配。因此数据包类型将是' HEADER'或者' PAYLOAD',标题将包含有效负载的元数据,允许您确保它不会与其他数据混淆。