1

因此,我的任务是为我们的 QA 部门创建一个工具,该工具可以从网络中读取数据包并正确重组消息(他们不信任我们的日志……长篇大论)。

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

一些数据包中包含一条消息的结尾和下一条消息的开头,我无法弄清楚 .NET 中的 NetworkStream 对象如何能够判断一个应用程序级消息在哪里结束而另一个在哪里开始。

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

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

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

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

没有为分段设置 IP 级别标志,并且 .NET 套接字不了解应用程序级别协议。所以我觉得这非常令人烦恼。任何见解将不胜感激。

4

1 回答 1

4

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

NetworkStream它没有内置任何东西来将数据转换为对象。是什么让你认为它确实有效?设法使用 NetworkStream 的代码是什么样的?您是否正在执行某种形式的 XML 反序列化,并且读取代码在到达结束标记时会自动停止?

基本上:

  • 如果您的协议没有任何消息分隔符或长度前缀,它可能应该有
  • NetworkStream itself is highly unlikely to be doing anything clever - but if you could tell us what you're observing, we can maybe work out what's going on.
于 2010-02-01T23:26:05.687 回答