2016-11-10 91 views
1

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

编辑:问题不会影响软件包之间的顺序或ID,而是影响软件包中的字节。在开始时一切正常,每个缓冲区都被正确解码。一段时间后,不能解码缓冲区,因为它包含不正确的数据。它看起来像缓冲区中的字节被移动或更改。缓冲区开始处的字段(时间戳,命令,长度)包含不可能的值。所以当我想获得发送数据的长度时,值为-1534501133而不是1048556(1048556是一个包中发送数据的正确最大大小)。它随机发生,但始终与发送较小的独立缓冲区的时刻连接。附加信息是,较小的缓冲区是使用定时器重复发送的,并且问题发生在随机时刻。有时甚至有可能发送整个数据(例如300 MB)而没有问题,但它很少发生。

我希望我已经清楚了。

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

+0

*缓冲区中的'起始字节'和'结束字节'对于查找缓冲区的开始和结束没有用处,因为这些字节很可能出现在数据中。你在那里编码长度。目前尚不清楚问题是什么。 –

回答

0

用唯一的ID标记数据,以便知道数据与什么消息相关。另外,将数据包标头与数据包有效载荷分开。

所以,你的第一个要求是[ID] [PACKETTYPE] [时间] [COMMAND] [长度] [CRC]

其次是[ID] [PACKETTYPE] [数据]

你然后可以将这些ID与分组类型进行匹配。因此,数据包类型将是'HEADER'或'PAYLOAD',头部将包含有效载荷的元数据,以确保它不会与其他数据混淆。

+0

感谢您的回答,但它不能解决我的问题。我向我的帖子中添加了一些信息以更多地解释它。 – Matis4

相关问题