2013-12-14 3 views
1

Я учусь с Libpcap из этого http://www.tcpdump.org/pcap.html и я столкнулся с проблемой с этим кодом:Программирование с примером PCAP

struct sniff_ethernet { 
    u_char ether_dhost[ETHER_ADDR_LEN]; /* Destination host address */ 
    u_char ether_shost[ETHER_ADDR_LEN]; /* Source host address */ 
    u_short ether_type; /* IP? ARP? RARP? etc */ 
}; 

...

const struct sniff_ethernet *ethernet; /* The ethernet header */ 
ethernet = (struct sniff_ethernet*)(packet); 

Я получаю значения ether_type с измененными байтами. Я думаю, что причина в том, что я использую x86_64 малоконечную машину, где LSB находится на самом низком адресе, а в потоке байтового пакета ether_type MSB находится до LSB. Вопрос в том, что код примера работает только на машинке big-endian или я что-то упускаю?

ответ

0

В примере код http://www.tcpdump.org/pcap.html не смотрит на тип Ethernet, поэтому он работает независимо от порядка байтов машины, на которой он работает. Он полагается на фильтр захвата («порт 23»), чтобы не захватывать трафик, отличный от IPv4.

Вам нужно будет, например, использовать ntohs() в поле ether_type, когда вы используете его значение в своем коде.

+0

Я не знал 'ntohs()', и он решил мою проблему, чтобы обнаружить фреймы 802.1Q, так что спасибо! –

Смежные вопросы