.NET的NetworkStream如何在同一个数据包中分隔多个消息?

时间:2010-02-01 23:22:07

标签: c# .net networking tcp packet-capture

所以我的任务是为我们的QA部门创建一个工具,它可以读取数据包并正确地重新组合消息(他们不相信我们的日志......长篇故事)。

我正在尝试收听其通信的应用程序正在使用.NET的TcpListener和TcpClient类进行通信。拦截数据包不是问题(我正在使用SharpPcap)。但是,正确将数据包重新组合成应用程序级别的消息证明有点困难。

有些数据包有一条消息的结尾和下一条消息的开头,我无法弄清楚.NET中的NetworkStream对象如何能够分辨出一个应用程序级别消息的结束而另一个消息的开始。 / p>

我已经能够发现任何包含应用程序级别消息结尾的数据包都会打开TCP标题“PSH”(推送)标志。但我无法弄清楚.NET是如何知道消息的结尾在该数据包中的确切位置。

一个数据包的数据可能如下所示:

/></Message><Message><Header fromSystem=http://blah

如何知道流只发送到</Message>到应用程序的末尾并存储其余内容,直到消息的其余部分完成为止?

没有为碎片设置IP级别标志,并且.NET套接字不了解应用程序级协议。所以我发现这令人难以置信的烦恼。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:4)

流不知道任何结束 - 它应该是应用程序协议的一部分。

NetworkStream没有内置任何内容将数据转换为对象。是什么让你觉得它呢?设法使用NetworkStream的代码是什么样的?您是否正在进行某种形式的XML反序列化,阅读代码在到达结束标记时会自动停止?

基本上:

  • 如果您的协议没有任何消息分隔符或长度前缀,则可能应该
  • NetworkStream本身不太可能做任何聪明的事 - 但如果你能告诉我们你在观察什么,我们可以解决正在发生的事情。