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

标签 c# .net networkstream

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

stream.Read(message, 0, 1)

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

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

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

最佳答案

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

通过这种方法,您不会最终阅读恶意客户端发送给您的大量内容,目的是对您的应用程序进行 DoS 攻击,并且您可以快速确定您是否阅读了足够多的内容来处理数据包或如果还没有完成。

关于c# - 如何在 NetworkStream 字节数组中放置分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13974228/

相关文章:

c# - .NET:HttpClient 使用我的接口(interface) IHttpClient 模拟它,但有一个内部对象为 NULL,它是密封的

c# - 如何从文件路径名中提取文件名?

C# 自定义属性属性反射

.net - 我可以签署没有源代码的程序集吗?

java.io.IOException : Permission denied on network folder 异常

c# - 如何为网络驱动器上的 File.Create 方法设置超时?

c# - add-in for visual studio 2010编译报错Connect类

c# - winform中的图表显示错误点

c# - 隐式传递参数给基本构造函数

c# - 获取 NetworkStream 中可用数据的长度