对于直接定义的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) { .... }