struct mgmt_header_t {
u_int16_t fc; /* 2 bytes */
u_int16_t duration; /* 2 bytes */
u_int8_t da[6]; /* 6 bytes */
u_int8_t sa[6]; /* 6 bytes */
u_int8_t bssid[6]; /* 6 bytes */
u_int16_t seq_ctrl; /* 2 bytes */
};
void my_callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
//printf("********* New Packet Arrived *********\n");
//printf("Jacked a packet with length [%d]\n", header->len);
struct mgmt_header_t *mac_header = (struct mgmt_header_t *) (packet+24);
if (mac_header->fc > 255 )
printf("comon");
我知道 mac_header 位于正确的位置,因为我从中获取了 mac 地址,它们是正确的,但问题是 fc 永远不会大于 255,所以左字节总是为零
更新:
我想我现在明白了,谢谢盖伊和奥特—— 供参考,这是我的完整示例http://pcap-wireless.blogspot.com/2011/11/post-2-80211-mac-header.html
引用 IEEE Std 802.11-2007第 7.1.1 节“约定”:
在图中,字段内的所有位都被编号,从0到k,其中字段的长度为k + 1位。字段内的八位字节边界可以通过对字段的位数取模 8 来获得。数字字段中比单个八位字节长的八位字节按重要性递增顺序(从最低编号位到最高编号位)进行描述。字段中长于单个八位位组的八位位组按照从包含最低编号位的八位位组到包含最高编号位的八位位组的顺序发送到 PLCP。
“长于单个八位位组的字段中的八位位组按照从包含最低编号位的八位位组到包含最高编号位的八位位组的顺序发送到 PLCP。”意味着字段以 little-endian 顺序传输,而不是 big-endian 顺序。因此,值为 0x0080 的 16 位字段将作为值为 0x80 的八位位组(字节)传输,后跟值为 0x00 的八位位组。
这意味着在 Wiretap 十六进制转储中,您将看到 80 00,但这意味着 0x0080,而不是 0x8000。
顺便说一句,请注意,radiotap header 不保证为 24 字节长;标头包含一个(小端)长度字段,指定标头的长度。
fc
字段的前 8 位,或者当它是关联请求时为零。但是,您不是通过分配(数据包+24)来跳过标头吗?您可以添加数据包前 32 个字节的十六进制转储吗?