void packet_handler(u_char * param,const struct pcap_pkthdr * header,const u_char * pkt_data)
{
if(kbhit())
return ;
//struct tm * ltime;
//char timestr[16]; ////转换时间戳格式
//ltime = localtime(&header->ts.tv_sec);
//strftime(timestr,sizeof(timestr),"%H:%M:%S",ltime);
//printf("%s,%.6d len:%d \n",timestr,header->ts.tv_usec,header->len); pEH = (EthernetHdr *)pkt_data;
printf("%x-%x-%x-%x-%x-%x",
  pEH->srcaddr[0],pEH->srcaddr[1],pEH->srcaddr[2],pEH->srcaddr[3],pEH->srcaddr[4],pEH->srcaddr[5]);
printf("----------");
printf("%x-%x-%x-%x-%x-%x",
pEH->destaddr[0],pEH->destaddr[1],pEH->destaddr[2],pEH->destaddr[3],pEH->destaddr[4],pEH->destaddr[5]);
printf("protocol:%x",pEH->protype);
printf("\n"); Sleep(200);
}//以太网帧头部
//类型0800 IP数据报
//类型0806 ARP请求/应答
//类型8035 RARP请求/应答
typedef struct _ethernethdr
{
unsigned char destaddr[6];     //6byte的目的硬件地址
unsigned char srcaddr[6];      //6byte的源硬件地址
unsigned short protype;        //2byte的协议类型
}EthernetHdr;分析的结果,协议显示的都6488或是608,是哪个出的问题呢。

解决方案 »

  1.   

    你是用ADSL抓的报文。1、你应该定义一个PPPOE头,在这个位置是8864(联通以后就是这个)或者8863(发现阶段,拨号之前)。
    2、608就是ARP请求报文,你没有转换字节序,因此看着是608。用会htons函数转换一下即可出现0806了。PPPOE的头:
                       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      |       DESTINATION_ADDR        |
                      |          (6 octets)           |
                      |                               |
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      |         SOURCE_ADDR           |
                      |          (6 octets)           |
                      |                               |
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      |    ETHER_TYPE  (2 octets)     |
                      |     0x8863 or 0x8864          |
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      |                               |
                      |       PPPOE Header            |
                      |          (6 octets)           |
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      ~                               ~
                      ~           payload             ~ 
                      ~                               ~
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      |           CHECKSUM            |
                      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      

  2.   

    那对于抓到的一个数据包,是不是根据那个2字节的ETHER_TYPE来判断这个包是ADSL的还是其它的?
      

  3.   

    1、你在打印MAC地址的时候,相当于做了一次字节序变换。你没有发现,你打印的时候,先打的数组下标为0的数,最后打最高位的。这就是字节序变换啊。
    2、协议分析的时候可以不变换,你就定义6488(PPPOE)、0608(ARP请求)这样不就可以了吗,不过这样总是看起来不舒服对吧?
    那对于抓到的一个数据包,是不是根据那个2字节的ETHER_TYPE来判断这个包是ADSL的还是其它的?
    ======================================
    是的。8864、8863就是PPPOE报文,PPPOE报文也是一种ethernet报文。
      

  4.   

    1、你在打印MAC地址的时候,相当于做了一次字节序变换。你没有发现,你打印的时候,先打的数组下标为0的数,最后打最高位的。这就是字节序变换啊。
    ----------------------------------------------------------
    这就是做了一交转换了?还真不知道呢。回去做个测试了。谢谢啊。