7

我正在建立一种在服务器和客户端之间进行通信的方式。我目前的工作方式是,流的第一个字节将包含一个指示即将到来的内容,然后查找该请求的类,我可以确定请求的长度:

stream.Read(message, 0, 1)

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

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

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

4

2 回答 2

4

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

通过这种方法,您最终不会阅读恶意客户端发送给您的大量内容,目的是对您的应用程序进行 DoS,并且您可以快速确定您的阅读内容是否足以处理数据包,或者它是否尚未完成。

于 2012-12-20T14:27:35.633 回答
0

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

于 2012-12-20T14:29:05.020 回答