2012-04-01 7 views
2

Hallo ich benutze C++ und libpcap. Wenn ich versuche, die Funktion "mycallback" aufzurufen, bekomme ich einen Baufehler. Dies sind die Funktion:Erstellungsfehler pcap_loop mit libpcap und C++

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

und der Aufruf der Funktion:

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

Und das ist der Fehler:

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 *)} ' 

Ich verstehe nicht, die Fehler, weil die Erklärung ist das gleiche, kann mir jemand helfen?

Danke.

+0

'Capture- :: capturar() 'ist nicht statisch Wenn es war würde es wahrscheinlich funktionieren, aber es ist nicht erforderlich zu arbeiten – Flexo

+0

possi ble Duplikat von [Verwenden einer C++ - Memberfunktion als C-Callback-Funktion] (http://stackoverflow.com/questions/1000663/using-a-c-class-member-function-as-a-c-callback-function) – Flexo

Antwort

2

Ihr Rückruf ist eine Klassenmitgliedsfunktion. Auf den meisten Plattformen können Sie eine Klassenmitgliedsfunktion static verwenden, aber idealerweise sollten Sie nur eine reguläre Funktion verwenden. Wenn es einen speziellen Zugriff auf die Klasse benötigt, können Sie die Funktion friend der Klasse machen.

Der Fehler hat dies deutlich machen:

... 'void (Capture-::) (unsigned char *, const pcap_pkthdr ... stimmt nicht überein' {aka pcap_handler void (*) (unsigned ...

Hinweis Capture :: erscheint auf der linken Seite des ‚paßt nicht‘ und nicht auf der rechten Seite? Jedes Mal, wenn Sie einen Fehler wie diese zu erhalten, die beiden Seiten vergleichen und sehen, was anders ist.

1

eine separate capture_callback_handler globale Funktion deklariert (oder statische Klassenfunktion):

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

und rufen dann pcap_loop wie folgt aus:

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

Dies ist eine Standard-C-Mehr instance "Rückruf" -Muster .