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,是哪个出的问题呢。
{
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,是哪个出的问题呢。
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、协议分析的时候可以不变换,你就定义6488(PPPOE)、0608(ARP请求)这样不就可以了吗,不过这样总是看起来不舒服对吧?
那对于抓到的一个数据包,是不是根据那个2字节的ETHER_TYPE来判断这个包是ADSL的还是其它的?
======================================
是的。8864、8863就是PPPOE报文,PPPOE报文也是一种ethernet报文。
----------------------------------------------------------
这就是做了一交转换了?还真不知道呢。回去做个测试了。谢谢啊。