我正在使用libtrace來解析網絡數據包,但我有,我認爲是endian問題。將數據包轉換爲結構的Endian問題
這裏是一個Radiotap包的libtrace定義:
typedef struct libtrace_radiotap_t {
uint8_t it_version; /**< Radiotap version */
uint8_t it_pad; /**< Padding for natural alignment */
uint16_t it_len; /**< Length in bytes of the entire Radiotap header */
uint32_t it_present; /**< Which Radiotap fields are present */
} PACKED libtrace_radiotap_t;
所以我投我libtrace_packet_t
這個Radiotap結構和檢查結果:
link = (char *) trace_get_packet_buffer(packet, &linktype, NULL);
if (linktype != TRACE_TYPE_80211_RADIO)
return;
rtap = (libtrace_radiotap_t *) link;
printf("%d %d %d %d\n", rtap->it_present, rtap->it_pad, rtap->it_len,
rtap->it_present);
在我的機器,這是小endian,來自我的pcap文件中的數據包的Radiotap數據是:
806959 0 72 806959
這是正確的。我的開發機器成功解析了我期望從pcap文件中看到的數據。
當我生產的盒子,裏面是大端跑,我看到不同的值:
793775104 0 18432 793775104
同PCAP文件中相同的數據包。不同的Radiotap值。我懷疑這個問題是由於兩臺機器的不同的排列順序。但是,rtap.it_version
是一個uint8_t
,它是單字節,不應受endian問題的影響,不是?
在這兩種情況下,您的8位值it_pad都會打印相同的「0」。您正在打印兩次「it_present」。你沒有打印'it_version'。 – lurker
那真是愚蠢的我。你已經解決了我的Radiotap問題。然而,引導我到另一個問題。當我的''link''投向[Frame Control結構](http://www.wand.net.nz/trac/libtrace/browser/trunk/libpacketdump/link_4.c#L31)時,我的兩臺機器顯示了兩個「fc.type」和「fc.subtype」的不同值。這是FC結構中uint8_t的endian問題嗎? – Kane
POSIX有'htonl','ntohl'等接口在「網絡」和「主機」之間進行轉換。 –