LINUX.ORG.RU

libpcap ((un)packed headers)


0

0

В общем-то я запостил это дело разработчикам (https://sourceforge.net/tracker/index.php?func=detail&aid=1557144&gro...), но может здеся тоже пособят.. Вкратце и по-русски...

Капчурится некий интерфейс, вот так выглядит кусок кода с обработчиком приходящих с оного данных...

struct data_header
{
struct ethhdr eth;
struct iphdr ip;
};

void pcap_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes)
{
struct data_header *hd=(struct data_header*)bytes;
unsigned int saddr=ntohl(hd->ip.saddr);
unsigned int daddr=ntohl(hd->ip.daddr);
/*...и можно выводить в консоль сорс и дест адреса, например при помощи правого сдвига и побитового умножения...не суть важно*/
}

Эмпирически установлено, что при работе с обычными ифейсами вроде eth0 и lo структуру struct data_header треба паковать посредством __attribute__((packed)), это и понятно. Непонятно другое! Если в качестве ифейса выступает "any" (виртуальный обобщённый сетевой интерфейс), то упаковку надо убрать, иначе смещается всё.... Кто-нить сталкивался с подобным? Это что, так нужно чтоль?

если снимать с any, то в вашей структурке первым должен идти не ethhdr eth :) откуда там езернет..

если работаете с any - то вам первым делом надо анализировать pcap_pkthdr - там помниться есть поле, по которому можно понять чё пришло и какую структурку вам подставить.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.