Ошибка сборки pcap_loop с libpcap и c ++

Привет, я использую 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 *)} '

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

Спасибо.


person user1027524    schedule 01.04.2012    source источник
comment
Capture::capturar() не статичен. Если бы это было так, возможно, это сработало бы, но для работы этого не требуется.   -  person Flexo    schedule 02.04.2012
comment


Ответы (2)


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

Ошибка прояснила это:

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

Обратите внимание, что Capture :: появляется слева от «не совпадает», а не справа? Всякий раз, когда вы получаете такую ​​ошибку, сравните две стороны и посмотрите, в чем разница.

person David Schwartz    schedule 01.04.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 с несколькими экземплярами.

person Andrew Tomazos    schedule 01.04.2012