如何在NetworkStream字节数组中放置分隔符?

时间:2012-12-20 14:23:55

标签: c# .net networkstream

我正在建立一种在服务器和客户端之间进行通信的方法。我现在如何工作,是一个流的第一个字节将包含一个指示即将发生的事情,然后查找该请求的类我可以确定请求的长度:

stream.Read(message, 0, 1)

if(message == <byte representation of a known class>)
{
    stream.Read(message, 0, Class.RequestSize);
}

我很好奇如何处理类大小未知的情况,以及在读取已知请求后数据是否已损坏。

我想我可以在流中插入某种分隔符,但由于一个字节只能在0-255之间,我不知道如何创建一个唯一的分隔符。我是否要将模式放入流中以表示消息的结束?我如何确定这种模式足够独特,不会被误认为是实际数据?

2 个答案:

答案 0 :(得分:4)

这方面有不同的方法。一种选择是首先发送类名的长度和整个数据包的可能性(例如总是第一个字节)。通过这种方式,您可以读取该字节,然后再读取n个字节以获取类名。

通过这种方法,您最终不会阅读恶意客户端发送给您的批次,其目的是为您的应用程序提供DoS,并且您可以快速确定您是否阅读了足够的数据来处理数据包或如果尚未完成。

答案 1 :(得分:-1)

有一些低级字节特别用作分隔符。文本开头和文本结尾的(十六进制)值分别为0x02和0x03。你有标题的开头加上传输结束,0x01和0x04;你可以使用这些。