Я не совсем уверен, что понимаю, о чем вы спрашиваете, но я думаю, что смогу это охватить.
Во-первых, обработчик отправки - это просто функция, соответствующая этой сигнатуре:
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 захватил из указанного сетевого интерфейса.По сути, каждый раз, когда пакет успешно извлекается, ваш обработчик вызывается с помощью указателя функции, причем детали пакета кодируются в этих аргументах и передаются через предоставленный пользователем указатель аргумента.