- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 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/
我正在尝试使用 C 中的 pcap 进行一些嗅探,如 here 所解释的那样我的问题是 pcap_loop 绝对不捕获任何数据包和/或不执行任何操作,我的回调函数从未被调用。我的猜测是超时值,但即使我
我收到这个警告: cast to pointer from integer of different size 尝试编译我的程序时。这段特殊的代码几乎是从一个示例 TCP 连接程序中提取出来的,我只是
我正在尝试使用 Linux 中 libpcab 库中的 pcap_loop 函数和这个原型(prototype): int pcap_loop(pcap_t *, int, pcap_handler,
我有一个数据包捕获应用程序,它使用 pcap_loop() 进行数据包捕获,但发现数据包丢失。 我正在尝试向主机发送 20 个 DNS 查询。在机器上运行 tcpdump 显示 1 已收到 20 个
我正在尝试使用 pcap 进行一些简单的数据包捕获,因此我创建了一个句柄来通过 eth0 进行监听。我的问题是代码末尾附近的 pcap_loop(handle, 10, myCallback, NUL
我需要将两个不同类型的指针传递给 pcap_loop(),以便 pcap_handler 可以读取/修改该数据。 pcap_loop() 看起来像: int pcap_loop(pcap_t *p,
我遇到了 pcap 过滤器的问题。以下是部分代码: #include #include void pcap_fatal(const char *failed_in, const char *err
我正在使用 libpcap 编写嗅探器。我的问题是在调用 pcap_loop() 或 pcap_next() 和实际获取数据包(调用回调函数)之间有 7-10 秒的延迟。但是,如果我在同一台设备上使用
pcap_loop 和 pcap_dispatch 到底有什么区别? 最佳答案 手册很好地描述了这一点(我是板着脸说的,保证)。来自 man pcap_loop : pcap_loop() pr
我的问题如下:pcap_loop() 从监听接口(interface)获取所有到达的帧,如果其中一个帧包含 IP 数据,我将使用 pcap_sendpacket() 转发它。一旦我发送它,pcap_l
为什么调用pcap_loop函数后,必须等几秒才能抓到第一个包? void print_packet(u_char *, const struct pcap_pkthdr *, const u_cha
我有一个问题,假设我有一个线程可以捕获数据包并自行处理它们。 使用 pcap_next_ex:我会使用一个循环,我会在每次交互中处理数据包,假设我调用 Sleep(200) 来模拟这些东西。使用 pc
我目前正在使用 libpcap 以混杂模式嗅探流量 int main() { // some stuff printf("Opening device: %s\n", devname.
因为我想用 libpcap 做一些测试和一个小的 C 程序,我试图将一个结构从 main() 传递到 got_packet()。阅读 libpcap 教程后,我发现了这一点: The prototyp
这两个函数都是无限循环, 一旦在同一线程中调用,程序就会挂起。 gtk_main(); ... pcap_loop(adhandle, 0, packet_handler, NULL); 当我点击“开
我对套接字编程完全陌生。我正在尝试嗅探和欺骗数据包。我在 Linux 的 libpcap 库中使用 pcap_loop 并使用以下签名: int pcap_loop(pcap_t *p, int cn
我有 libpcap 版本 0.6 和 linux 内核版本 2.6.18,其中我无法升级其中任何一个,pcap_breakloop() 函数可从版本 0.8 获得。 我的问题是如何在不使用 pcap
我用 Google 搜索了很多,但我不知道 user 参数是什么用于 pcap_loop()。我在网上找到的最好的一个来自斯坦福大学(链接:http://yuba.stanford.edu/~casa
您好,我正在使用 C++ 和 libpcap。当我尝试调用函数“mycallback”时,出现构建错误。这些是函数: void Capture::mycallback (unsigned char *
如果您使用阻塞式 pcap_loop() 或 pcap_dispatch() 通过合适的回调 fn 处理传入的数据包数据,您可能需要中断这些函数,即让他们返回。 现在 pcap_breakloop()
我是一名优秀的程序员,十分优秀!