gpt4 book ai didi

c++ - pcap_loop 中的回调方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:22 25 4
gpt4 key购买 nike

我正在尝试使用 Linux 中 libpcab 库中的 pcap_loop 函数和这个原型(prototype):

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

我在这里做错了什么?

编辑:我发现了一个类似的帖子 here .

最佳答案

您的回调函数不能是成员函数(方法)。不要忘记成员函数总是有隐藏参数 this

您的回调函数必须是命名空间级函数或类的静态成员。

如果你想让你的对象可用于你的 CB 函数,你可以使用 user 成员(pcap_loop() 的最后一个参数,回调的第一个成员函数),具有适当的类型转换,以传递任意数据,在您的情况下,该数据应是您用于捕获的对象。

下面的代码不完整并且未经测试,但可能会给您一个想法。

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));
}
};

关于c++ - pcap_loop 中的回调方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com