Sniffer,关于Winpcap、Windows导致的大小端问题

对于直接定义的Ethernet头

#pragma pack (0)
typedef struct ether_header
{
u_char ether_dhost[6]; //dest address
u_char ether_shost[6]; //src address
u_short ether_type; //type
}ether_header;

如果直接如下操作:

eh = (ether_header*)pkt_data;
switch(eh->ether_type)
{
....
}

会发现得到的type都是字节序反的,例如IP本应该是0x0800,变成了0x0008,显然memcpy导致的大小端问题惹得祸。
Windows抄袭了Linux的socket,提供了ntohs,把网络字节序转换成本CPU的字节序。

如下更改即可:

#include <Winsock2.h>

eh = (ether_header*)pkt_data;
et = ntohs(eh->ether_type);//注意转换成本机序
switch(et)
{
....
}

Leave a Reply

Your email address will not be published.