Передача аргумента в функцию обратного вызова libpcap pcap_loop () - PullRequest
5 голосов
/ 14 ноября 2009

Поскольку я хотел бы сделать несколько тестов с libpcap и небольшой программой на C, я пытаюсь передать структуру из main () в got_packet (). Прочитав учебник по libpcap, я нашел это:

Прототипом для pcap_loop () является ниже:

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

Последний аргумент полезен в некоторых приложения, но много раз просто установить как NULL. Предположим, у нас есть аргументы наших собственных, которые мы хотим отправить нашим функция обратного вызова, в дополнение к аргументы, которые отправляет pcap_loop (). это где мы это делаем Очевидно, вы должны приведите тип к указателю u_char, чтобы результаты делают это там правильно; как мы увидим позже, pcap использует некоторых очень интересных средств Передача информации в виде указатель u_char.

Таким образом, в соответствии с этим, можно отправить структуру в got_packet (), используя аргумент номер 4 в pcap_loop (). Но после попытки я получаю ошибку.

Вот мой (ошибочный) код:

int main(int argc, char **argv)
{
 /* some line of code, not important */

 /* def. of the structure: */
 typedef struct _configuration Configuration;
 struct _configuration {
   int id;
   char title[255];
 };

 /* init. of the structure: */
 Configuration conf[2] = {
   {0, "foo"},
   {1, "bar"}};

 /* use pcap_loop with got_packet callback: */
 pcap_loop(handle, num_packets, got_packet, &conf);
}

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
 /* this line don't work: */
 printf("test: %d\n", *args[0]->id);
}

Я получаю такую ​​ошибку после некоторых тестов:

gcc -c got_packet.c -o got_packet.o
got_packet.c: In function ‘got_packet’:
got_packet.c:25: error: invalid type argument of ‘->’

Вы видите, как я могу отредактировать этот код, чтобы передать conf (с массивом конфигурационной структуры) в функцию got_packet ()?

Большое спасибо за любую помощь.

Привет

Ответы [ 3 ]

4 голосов
/ 14 ноября 2009

Я переписываю Ваш код, теперь он компилируется без ошибок:

#include <pcap.h> 

typedef struct {
  int id;
  char title[255];
} Configuration;

void got_packet( Configuration args[], const struct pcap_pkthdr *header, const u_char *packet){
  (void)header, (void)packet;
  printf("test: %d\n", args[0].id);
}

int main(void){
  Configuration conf[2] = {
    {0, "foo"},
    {1, "bar"}};

  pcap_loop(NULL, 0, (pcap_handler)got_packet, (u_char*)conf);
}
2 голосов
/ 14 ноября 2009

Вам нужно определить структуру вне main () и привести args в got_packet () как:

Configuration *conf = (Configuration *) args;
printf ("test: %d\n", conf[0].id);
1 голос
/ 03 августа 2011

Для компиляции вышеуказанного кода.

установить libpcap -> sudo apt-get установить libpcap0.8-dev

затем -> gcc got_packet.c -lpcap -o got_packet.o

...