2009-02-25 28 views
1

所以我幾乎完成了一個涉及Win32編程和套接字的任務,但是我必須生成並分析一些關於傳輸的統計信息。我唯一遇到的問題是如何計算從客戶端發送到服務器的數據包數量。統計從客戶端發送到服務器的數據包數量?

發送的數據可以是可變長度的,所以我不能只將接收到的總字節數除以#define'd值。

我們必須使用異步調用做的一切,所以我一直在試圖增加每FD_READ消息,我得到了服務器的套接字的計數器。但是,因爲我必須能夠接受可能較大的文件大小,所以我必須調用recv/recvfrom,緩衝區大小爲64k左右。如果我發送一個小包(a-z),就沒有問題。但是,如果我發送一個1024個字符的字符串10x,則服務器會報告收到的2或3個數據包,但發送/接收的字節數據丟失爲0%。

任何想法如何獲得數據包的數量?

感謝提前:)

+0

我假定這是一個流套接字(即TCP),而不是一個數據報套接字(即UDP)? ...問題是你正在接收流片段而不是數據包。 – 2009-02-25 16:56:06

+0

我們實際上必須實現TCP和UDP。我不太清楚你的流片段是什麼意思,但是數據全部被讀取 - 它只是被排隊等待直到我調用recv/recvfrom,然後它儘可能多地抓取它。我需要圍繞這個來計算。 – David 2009-02-25 17:05:57

回答

0

不是直接回答你的問題,而是針對不同的解決方案的建議。

如果您要在要傳輸的數據前發送長度描述符,該怎麼辦?這樣,您就可以在客戶端分配正確的緩衝區大小(不要太多,不能太少),並檢查傳輸結束時是否有任何損失。

使用TCP你應該沒有問題,因爲在所有的協議本身處理無差錯傳輸或以其他方式,你應該得到一個有意義的錯誤。

也許在UDP中,你也可以用propper sequence-id將你的傳輸分成固定大小的塊。在對它們進行排序之前,您必須累積所有傳入的包(UDP不能保證接收訂單)並將數據粘貼在一起。

另一方面,如果真的需要支持UDP,你應該考慮一下,因爲如果你想讓該協議安全無誤,那麼會有一些手動開銷......(請參閱Wikipedia Article on TCP獲取需要解決的問題)

0

您的數據包是否有固定標題,或者您是否允許定義您自己的數據包。如果你可以定義你自己的,在頭中包括一個數據包計數器以及長度。您必須保持計數器中計算翻轉的運行總數,但這將確保您計算髮送的數據包,而不是收到的數據包。對於一個簡單的任務,你可能不會遇到丟失(顯然是使用UDP),但如果你是這樣,一個包計數器將確保你的統計數據準確地反映了發送的消息。

1

這真的歸結爲你的意思是'包'。

如你可能知道,當對導線發送的TCP/UDP消息時,發送的數據是「包裹」或前綴,與相應的TCP/UDP報頭。然後將其「封裝」在IP報頭中,該報頭又被「封裝」在以太網幀中。如果你使用像Wireshark這樣的嗅探包,你可以看到這個突破。

問題是這樣的。當我聽到「數據包」這個術語時,我想到了IP級別的數據。 IP數據在網絡上真正打包,因此在談論IP時數據包計數是有意義的。但是,如果您使用常規套接字發送和接收數據,則會剝離IP標頭以及TCP/UDP標頭,即,您無法從套接字獲取此信息。如果沒有這些信息,就無法確定傳輸的「數據包」的數量(再次,我在考慮IP)。

你可以做別人都用長度和計數器添加自己的頭提示。這些信息將幫助您準確地確定接收緩衝區的大小,但它不會幫助您確定數據包數量(再次,IP ...),特別是在您執行TCP時。

如果你想準確地確定使用Winsock的插座,我建議建立一個「原始」插座的建議here數據包的數量。該套接字將收集本地NIC看到的所有IP通信。使用IP和TCP/UDP標頭根據您的客戶端和服務器套接字(即IP地址和端口號)過濾數據。這將準確瞭解實際使用多少個IP數據包傳輸數據。

相關問題