2010-02-10 18 views
2

我正在用C編寫應用程序,使用libpcap。我的程序偵聽新的數據包,並根據語法解析它們 。有效負載實際上是XML。TCP/IP編程,多個數據包中的數據

有時候一個數據包對於一個XML文件來說是不夠的,所以XML緩衝區被分成不同的數據包。 我想添加代碼邏輯來處理這些情況。但是,我不知道一個數據包不包含整個數據。我怎麼知道一個數據包有更多的數據將被髮送?如何識別新數據包包含其餘數據?

我是否必須使用TH_FIN標誌?你能向我解釋一下嗎?

回答

2

在TCP中沒有定義數據包的東西,這是由高層決定是否需要 - TCP只是一個流。

如果這是通過TCP流的原始XML,您實際上需要解析xml - 當您收到文檔元素的結尾時,您將知道何時有整個xml文檔。 如果它是通過HTTP打包的XML,則可能能夠解析出應包含正文長度的Content-Length:標頭。請注意,從捕獲的數據包中重新組裝TCP流是一個非常困難的問題,有很多角落情況下的,例如。你需要處理重傳,無序TCP段等等。 http://libnids.sourceforge.net/可能會幫助你。

0

如果您使用TCP,請使用TCP庫,將數據作爲數據流提供給您,而不是嘗試自己處理數據包。

0

流是好的。另一種選擇是將傳入的數據存儲在緩衝區(例如char *)中,並搜索應用程序消息傳遞成幀字符或Xml(根結束標記)的情況。一旦你在緩衝區的前面找到了一個完整的xml消息,把它拉出來處理。

1

正如匿名說使用更高級別的流庫。

但即使如此,在開始處理它之前,您仍需要知道塊的大小,因爲您將從塊中的n個字節的流中讀取數據。

因此,您想先發送二進制發送的字節數,然後發送x個字節,然後重複,因此,當您通過select/read接收到卡盤時,就知道所有的數據塊都已通過到處理器。

+0

只有當你是終結者時纔會有效,而不是如果你正在嗅探現有連接 – leeeroy 2010-02-10 23:06:33

+0

同意,我錯過了sniffing/snooping元素,並且只是假設他正在以嚴格的方式做套接字。 – 2010-02-11 15:30:23

0

Jabber使用的XMPP即時消息協議具有通過TCP流移動XML塊的方法。我不知道自己做了多少,但是RFC 3290是協議定義。你應該可以從中解決問題。