Ошибка сборки pcap_loop с libpcap и c ++ - PullRequest
2 голосов
/ 02 апреля 2012

Привет, я использую c ++ и libpcap.Когда я пытаюсь вызвать функцию «mycallback», я получаю ошибку здания.Это функция:

void Capture::mycallback (unsigned char * useless, const struct pcap_pkthdr *pkthdr, const unsigned char * packet){
[...]
}

и вызов функции:

void Capture::capturar(){
  [...]
  pcap_loop (descr, -1, mycallback, NULL);  //entramos en el bucle (infinito)
}

И это ошибка:

error: argument of type 'void (Capture ::) (unsigned char *, const pcap_pkthdr *, const unsigned char *)' does not match '{aka pcap_handler void (*) (unsigned char *, const pcap_pkthdr *, const unsigned char *)} '

Не понимаюошибки, потому что декларация такая же, кто-нибудь может мне помочь?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Ваш обратный вызов является функцией члена класса. На большинстве платформ вы можете использовать функцию-член класса static, но в идеале вы должны просто использовать обычную функцию. Если ему нужен особый доступ к классу, вы можете сделать функцию friend класса.

Ошибка действительно прояснила это:

... 'void ( Capture :: ) (без знака char *, const pcap_pkthdr ... не соответствует' {aka pcap_handler void (*) (без знака ...

Уведомление Capture :: появляется на левой стороне 'не совпадает', а не на правой стороне? Всякий раз, когда вы получаете ошибку, подобную этой, сравните две стороны и посмотрите, что отличается.

1 голос
/ 02 апреля 2012

Объявление отдельной глобальной функции capture_callback_handler (или статической функции класса):

void capture_callback_handler(unsigned char * user, const struct pcap_pkthdr *pkthdr, const unsigned char * packet)
{
    ((Capture*) user)->mycallback(user, pkthdr, packet);
}

и затем вызовите pcap_loop следующим образом:

  Capture* pCapture = this;
  pcap_loop (descr, -1, capture_callback_handler, (u_char*) pCapture);

Это стандартный шаблон обратного вызова для нескольких экземпляров C.

...