2013-01-31 41 views
6

(原諒我,如果我不能夠正確地提出問題,英語不是我的主要語言。)正確的方法來分析網絡數據包用C

我試圖解析對SyncE ESMC包。它是以太網慢速協議包。

方法1: 爲了解析這個數據包,我使用了類似於已經完成的操作的字節字節方法here

方法2: 解析數據包的其他方法是定義一個「結構」來表示整個數據包並訪問各個字段以檢索特定偏移量的值。然而,在這種方法中,結構填充和對齊可能出現在圖片中(我不確定),但在Linux上,各種分組頭部以結構的形式定義,例如,在ip.h中iphdr。 IP數據包(緩衝區)可以輸入'iphdr'來檢索IP頭字段,所以它必須工作。

哪種方法更好地解析C中的網絡數據包?

在通過方法2解析數據包時,結構填充和對齊是否有所幫助?如果是的話,Linux頭文件如何克服這個問題?

+0

所有編譯器都具有不填充結構或對齊成員字段的功能,並且您還可以使用位字段來縮短字節。 –

+0

@JoachimPileborg - 哪種方法會更好,portabale和高效? – Abhirav

+0

在編譯器,操作系統,硬件或其組合之間是否便攜?使用更少的內存或其他標準可以提高效率嗎?兩種方法都有優點,哪一種是「最好的」取決於你的目標。 –

回答

1

方法1是最好的可移植性。例如,它可以讓您安全地避免錯位訪問。特別是,如果你的機器是小端的,這種方法可以讓你輕鬆處理字節交換。

方法2有時很方便,而且通常編寫代碼更快。如果結構填充妨礙您的工作,您的編譯器可能會提供一個標誌或屬性(如__attribute__((__packed__))#pragma pack)來解決此問題。但是,如果你有一臺小端機器,你仍然需要在整個地方進行字節切換。

+0

感謝consise和準確的答案! – Abhirav