繁体   English   中英

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

[英]C# sending huge and small data buffers by socket and TCP

我想通过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),但很少发生。

我希望,我已经足够清楚地描述了它。

你对如何避免这个问题有什么建议吗?

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

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

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

然后,您可以将ID与数据包类型进行匹配。 因此数据包类型将是“HEADER”或“PAYLOAD”,标头将包含有效负载的元数据,允许您确保它不会与其他数据混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM