pcap_dispatch / передача аргументов в функцию обратного вызова - PullRequest
1 голос
/ 11 февраля 2012
int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

Я понимаю, что pcap_dispatch вызывает процедуру обратного вызова при получении пакета, и первый аргумент, переданный в процедуру обратного вызова, является последним аргументом функции pcap_dipatch. Так что насчет оставшихся двух аргументов подпрограммы обратного вызова. откуда pcap_dispatch получает другие аргументы для передачи?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2012

Два других аргумента получены из только что захваченного пакета (если вы использовали pcap_open_live() или pcap_create() / pcap_activate(), чтобы открыть pcap_t) или чтения из файла захвата (если вы использовали pcap_open_offline() pcap_t) - pkthdr - это структура, содержащая метку времени для пакета, длину пакета в том виде, в котором он появился в сети, и длину пакета после того, как он был урезан, на длину снимка, и packet - это необработанные пакетные данные.

1 голос
/ 11 февраля 2012

Я не совсем уверен, что понимаю, о чем вы спрашиваете, но я думаю, что смогу это охватить.

Во-первых, обработчик отправки - это просто функция, соответствующая этой сигнатуре:

void packethandler( u_char *args, const struct pcap_pkthdr* pkthdr, 
                    const u_char* packet )

Аргументы, которые есть, справа налево, извлекли пакет libpcap из сетевого интерфейса, заголовок пакета в формате pcap и аргументы обработчику пакета.

Представляю, если что-нибудь, первый аргумент, возможно, вызывает у вас проблемы.Если вам нужно передать несколько аргументов, вы можете сделать это - это не совсем то, что вы ожидаете.Вместо использования va_args, если вы хотите передать несколько аргументов, вы можете просто определить структуру.Предполагая, что typedef struct { ... } myparams;, вы можете передать:

(u_char*) myparamstruct

в качестве параметра, а внутри вашего обработчика выполните:

myparams* params = (myparams*) args;

Это работает, потому что вы передаете указатели, а не данные.Тип для указателей просто описывает базовый, разыменованный тип местоположения (способ интерпретации данных), а не фактическое значение указателя - поскольку все указатели одинаково широки (для целей этого, так или иначе).

Так что это может охватывать получение этих аргументов. Что касается оставшихся двух аргументов, как я уже говорил, это то, что libpcap захватил из указанного сетевого интерфейса.По сути, каждый раз, когда пакет успешно извлекается, ваш обработчик вызывается с помощью указателя функции, причем детали пакета кодируются в этих аргументах и ​​передаются через предоставленный пользователем указатель аргумента.

...