2013-05-08 68 views
0

我正在編寫一個應用程序來偵聽傳入的UDP數據包。有接收許多不同類型的數據包的可能性。例如,數據包可以這樣定義,C處理多種類型的UDP數據包

包A: int a | char b | int c |包裝B:|

包B:短int d | int e | char f |

等等。

我的問題是,鑑於我收到多種類型的消息,協調正在發送的內容和正在閱讀的內容的最佳方法是什麼?

正如我所看到的,可以在每條消息的開始處添加一個「標題」,定義其類型,或者如果我知道每個數據包的大小,則可以讀取消息長度並將其與我列出的相比較。

此外,如果後者是一個選項,是否保證每次都是預期的長度?

編輯:

我也能看到只用數據包的長度可能是一個問題,因爲可能有多個消息類型相同的長度。

+1

對'recvmsg'的每個調用都會返回一個完整的數據包(假設緩衝區足夠大),或者根本沒有。所以只要你的緩衝區覆蓋了所有可能的數據包,就能保證接收到發送的確切數據包。無論如何你仍然需要一個類型頭文件。 – 2013-05-08 18:28:39

回答

3

使用包含魔術字和定義類型的代碼的標題。這樣您就可以確保它是針對您的應用程序的,並確定了要使用的正確解析器。

序列號和時間戳也可能用於檢測丟失的數據包和那些到達序列不連續的數據包。這些是UDP遇到的常見問題。