【发布时间】:2013-08-30 06:12:43
【问题描述】:
我正在使用 libtrace 来解析网络数据包,但我认为这是一个字节序问题。
这是 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);
在我的小端开发机器上,来自我的 pcap 文件中数据包的 Radiotap 数据是:
806959 0 72 806959
这是正确的。我的开发机器正在成功解析我希望从 pcap 文件中看到的数据。
在我的大端生产盒上运行时,我看到不同的值:
793775104 0 18432 793775104
同一个 pcap 文件中的同一个数据包。不同的 Radiotap 值。我怀疑问题出在两台机器的不同字节序上。但是,rtap.it_version 是一个 uint8_t,它是单字节的,不应该受到字节序问题的影响,不是吗?
【问题讨论】:
-
在这两种情况下,您的 8 位值
it_pad打印相同:0。您正在打印it_present两次。你没有打印it_version。 -
那是我的愚蠢。你解决了我的 Radiotap 问题。不过,这让我想到了另一个问题。将我的
link转换为Frame Control struct 时,我的两台机器显示fc.type和fc.subtype的两个不同值。这是 FC 结构中uint8_t的字节序问题吗? -
POSIX 有
htonl、ntohl等接口用于在“网络”和“主机”字节序之间进行转换。
标签: c networking packet endianness