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