c#通过套接字和TCP发送大小数据缓冲区

本文关键字:小数 数据 缓冲区 TCP 套接字 | 更新日期: 2023-09-27 18:17:28

我想通过TCP发送巨大的缓冲区(从100MB到1GB)的数据。我通过将缓冲区划分为更小的缓冲区(大约1MB)并通过socket.send()发送来解决这个问题。每次调用socket.send()方法,发送以特定结构打包的部分数据(较小的缓冲区):[开始字节(1B),时间戳(4B),命令(4B),数据长度(4B),要发送的数据(?B), CRC(1B),结束字节(1B)]。当只有一个巨大的缓冲区由特定端口发送时,一切工作正常。但是,当我试图发送在同一时间的缓冲区与另一个数据(非常小,例如20字节)使用相同的TCP端口,然后TCP混合数据在缓冲区,它是不可能解码缓冲区了。缓冲区中的'开始字节'和'结束字节'对于查找缓冲区的开始和结束是没有用的,因为这些字节很可能出现在数据中。

EDIT: Issue不影响包之间的顺序或id,只影响包中的字节。一开始一切都很好,每个缓冲区都被正确解码。过了一段时间,就无法解码缓冲区,因为它包含不正确的数据。看起来缓冲区中的字节被移动或更改了。缓冲区开头的字段(时间戳、命令、长度)包含不可能的值。因此,当我想要获得发送数据的长度时,我得到的值例如-1534501133而不是1048556(1048556是一个包中发送数据的正确最大大小)。它是随机发生的,但它总是与发送较小的独立缓冲区的时刻连接。额外的信息是,使用计时器重复发送较小的缓冲区,并且问题在随机时刻发生。有时甚至可以毫无问题地发送整个数据(例如300 MB),但这种情况很少发生。

我希望我已经说得够清楚了。

你有什么建议来避免这个问题吗?

c#通过套接字和TCP发送大小数据缓冲区

用唯一id标记数据,以便您知道哪些数据与哪些消息相关。此外,将数据包头与数据包有效负载分开。

所以,你的第一个请求将是[ID][PACKETTYPE][TIME][COMMAND][LENGTH][CRC]

第二个是[ID][PACKETTYPE][DATA]

然后您可以将id与数据包的类型相匹配。所以包类型将是'HEADER'或'PAYLOAD',头将包含有效载荷的元数据,允许您确保它不会与其他数据混淆。