2012-04-01 3 views
2

こんにちは私はC++とlibpcapを使用しています。関数 "mycallback"を呼び出そうとすると、ビルドエラーが発生します。 これらの関数である:libapcapとC++でpcap_loopをビルドする

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

宣言ので、私はエラーを理解していません誰も私を助けることができますか?

ありがとうございました。

+0

'キャプチャ:: capturar() 'は静的ではありません。もしそれがうまくいけば動作しますが、動作する必要はありません。 – Flexo

+0

possi [Cコールバック関数としてC++クラスメンバ関数を使用する]の複製を作成する(http://stackoverflow.com/questions/1000663/using-a-c-class-member-function-as-a-c-callback-function) – Flexo

答えて

2

あなたのコールバックは、クラスメンバ関数です。ほとんどのプラットフォームでは、staticクラスメンバ関数を使うことができますが、理想的には正規関数を使うだけです。クラスへの特別なアクセスが必要な場合は、そのクラスの関数friendを作成することができます。

エラーは、これは明確にしなかった:

... '空隙(キャプチャ::)(unsigned char型の*、constのpcap_pkthdr ...が一致しません' {別名pcap_handler無効(*)(符号なし...

お知らせCapture ::は、あなたがこのようなエラーが出る場合は常に右側にある?、双方を比較し、違うものを参照してください「と一致しません」とないの左側に表示されます。

1

別々のグローバル関数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、マルチインスタンス "コールバック" パターンであります。

関連する問題