2010-02-01 36 views
1

所以我的任務是爲我們的QA部門創建一個工具,可以讀取數據包並正確重新組裝信息(他們不相信我們的日誌......長話短說)。.NET的NetworkStream如何在同一個數據包中分隔多個消息?

的應用,其通信我試圖偷聽使用.NET的的TcpListener和TcpClient的類進行通信。攔截數據包不是問題(我正在使用SharpPcap)。但是,正確將數據包重組爲應用程序級別的消息有點困難。

一些數據包有一個消息的結尾和下一個消息的開始,我無法弄清楚.NET中的NetworkStream對象如何能夠知道一個應用程序級消息何時結束,另一個開始。

我已經能夠弄清楚,包含一個應用級別消息的結束的任何分組將具有TCP報頭「PSH」(推)標誌接通。但我無法弄清楚.NET如何知道郵件的末尾在哪裏。

一個數據包的數據可能看起來像:

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

如何流知道只發送高達</Message>年底到應用程序和存儲的休息,直到消息的其餘部分是完整的?

有碎片整理的設置沒有IP位的標誌,和.NET插座沒有應用級協議的知識。所以我覺得這令人難以置信的煩惱。任何洞察力將不勝感激。

回答

4

流不知道任何事物的結束 - 它應該是應用協議的一部分。

NetworkStream沒有任何東西內置到它的數據轉換成一個對象。是什麼讓你覺得它呢?管理使用NetworkStream的代碼的外觀如何?您是否正在做某種形式的XML反序列化,並且讀取代碼在達到結束標記時會自動停止?

基本上是:

  • 如果協議中沒有任何消息分隔符或前綴長度,大概應該有
  • NetworkStream本身是高度不太可能做任何事情聰明 - 但如果你能告訴我們你在觀察什麼,我們可以研究發生了什麼。
+0

D'哦!我忘記了XML的反序列化。這正是發生的事情。你發現你的評論中的所有內容。謝謝你清理我的大腦屁。 :) – 2010-02-01 23:36:16

相關問題