[英]callback method in pcap_loop
我正在嘗試使用以下原型在 Linux 中的 libpcab 庫中使用 pcap_loop 函數:
int pcap_loop(pcap_t *, int, pcap_handler, u_char *);
pcap_pkthdr 是一個函數指針:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);
在我的程序中,我在類 SniffEthernet 中定義了以下方法:
void SniffEthernet::got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);
現在調用 pcap_loop 如下
pcap_loop(handle, num_packets, this->got_packet, NULL);
給了我以下編譯時錯誤:
SniffEthernet.cc:139:58: error: cannot convert ‘VENTOS::SniffEthernet::got_packet’ from type ‘void (VENTOS::SniffEthernet::)(u_char*, const pcap_pkthdr*, const u_char*) {aka void (VENTOS::SniffEthernet::)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ to type ‘pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’
我在這里做錯了什么?
編輯:我在這里找到了一個類似的帖子。
您的回調函數不能是成員函數(方法)。 不要忘記成員函數總是有隱藏參數this
。
您的回調函數必須是命名空間級函數或類的靜態成員。
如果你想讓你的對象可用於你的 CB 函數,你可以使用user
成員( pcap_loop()
的最后一個參數,回調函數的第一個成員),通過適當的類型轉換,傳遞任意數據,在你的case,應該是您用於捕獲的對象。
下面的代碼不完整且未經測試,但可能會給您一個想法。
class SniffEther {
private:
pcap_t *cap_handler;
char errbuf[PCAP_ERRBUF_SIZE];
/* capture-related data members (properties) */
public:
static friend void pkt_callback(u_char *user, const pcap_pkthdr *hdr, const u_char *bytes){
SniffEther *sniffer=reinterpret_cast<SniffEther *>(user);
/*
Process header and bytes.
You can call things like sniffer->somemethod(), and also
access sniffer->someproperty.
*/
}
// constructor
SniffEther(const char *if_name){
cap_handler=pcap_create(if_name, errbuf);
if(!cap_handler)
throw runtime_error(errbuf);
/* Set the many pcap_options (see pcap(3)). */
if(pcap_activate(cap_handler)!=0){
string error(pcap_geterr(cap_handler));
pcap_close(cap_handler);
throw runtime_error(error);
}
}
~SniffEther(){
if(cap_handler)
pcap_close(cap_handler);
}
void capture_loop(int pkt_count=-1){
if(
pcap_loop(
cap_handler, pkt_count, pkt_callback,
reinterpret_cast<u_char *>(this)
)==-1
)
throw runtime_error(pcap_geterr(cap_handler));
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.