我生锈的C++技能在失败之后失败了:
#include <pcap.h>
...
void Sniff::pcap_listen() {
pcap_t *loc;
char *dev;
dev = pcap_lookupdev(errbuf);
loc = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
pcap_loop(loc,-1,pcap_callback,NULL);
}
Run Code Online (Sandbox Code Playgroud)
error:类型'void(Sniff ::)(u_char*,const pcap_pkthdr*,const u_char*)'的参数与'void(*)(u_char*,const pcap_pkthdr*,const u_char*)'不匹配
在.h中添加/删除"静态"定义:无效.
++另一个问题:
listener = g_thread_create(pcap_listen, NULL, FALSE, NULL);
Run Code Online (Sandbox Code Playgroud)
很多变种的::,&,这个......经过测试,最有信息的信息是:
的src/main.cpp中:281:错误:类型无效*(嗅::)(无效*)'的参数不匹配'无效*( )(无效*)'
您不能将指向成员函数的指针传递给期望函数指针的东西.从根本上说,指向成员函数的指针是与函数指针完全不同的类型.两者之间没有平凡的转换,因为没有this指针,所以不能一个,这是调用非静态成员函数所必需的.
简单地添加static技术上也没有解决问题,因为它不会有C链接,这可能是符合实现的问题.在大多数实现中,这表现良好,但一般不便携,便携式解决方案需要使用
extern "C" {
void my_callback() {
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
鉴于您尝试调用的两个函数似乎都采用void*"用户参数",您可以将其与变量一起使用,以将指针传递给您的类的实例,例如:
class CallbackHandler {
public:
void my_callback();
};
extern "C" {
void callback_wrapper(void *arg) {
static_cast<CallbackHandler*>(arg)->my_callback();
}
}
void start_pcap_listen(CallbackHandler* receiver) {
pcap_t *loc;
char *dev;
dev = pcap_lookupdev(errbuf);
loc = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
pcap_loop(loc,-1,callback_wrapper,receiver);
}
Run Code Online (Sandbox Code Playgroud)
它不漂亮,但它的工作原理.