QT+Libpcap混合编程

pengcao89 2012-02-20 09:34:03

笔者近日,在做网络嗅探器,其中用到一函数,pcap_loop(pcap_t *,int,pcap_hander callback,u_char *);
callback参数如下:(u_char *,const pcap_pkthdr *,const u_char *);其作用是,来一个数据包,调用一次callback,来一次调用一次。
但,令笔者困惑的是,这个callback并不能被定义成类的成员,一旦定义成类的成员,编译便会报错
argument of type‘void (classname::)(u_char *,const pcap_pkthdr *,const u_char *) does not match void (*)(u_char *,const pcap_pkthdr *,const u_char *)’。
可是,不定义为成员,就访问不了类的成员。故,笔者换做了友元、static,编译,运行等,均不会有问题。可问题是,我想在callback当中使用类的成员。
问题:
如何在callback当中使用类的成员?或者,这个callback应该一何种方式来定义?在或者,如何通过QT的信号与槽机制来实现只?

这是因为libpcap是基于C的。而QT是基于C++的。使用libpcap编程,就是使用pcap_loop()来“接受到来的数据”;然后在调用CALLBACK来处理这些原始的数据,并显示。
问题二: 我需要一个图形界面,也就是说,我得需要将在CALLBACK处理数据的过程中,获得的一些数据包的信息在图形界面上显示,也就是在QT当中的“ Text Browser ” 显示数据。可是callback并不能够定义成为类的方法,又如何能够访问的到类的成员呢?
...全文
642 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengcao89 2012-05-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

谢谢楼上各位的回答!
现在自己已经找到解决方案!
自己使用C编写嗅探程序,生成可执行文件。

然后在QT当中调用该可执行文件,并将其输出定向到界面上就好了!
楼主具体怎么做的啊?求解。。。
[/Quote]
////2012-4-16 QProcess
connect(cmd,SIGNAL(readyRead()),this,SLOT(writeToTextBrowser()));
connect(ui->startButton,SIGNAL(clicked()),this,SLOT(runProcess()));
////2012-4-16 QProcess
void MainWindow::writeToTextBrowser(){
strData+=cmd->readAll();
ui->textBrowser->append(strData);
}
void MainWindow::runProcess(){
cmd->start(myexe);
strData=tr("");
ui->textBrowser->append(strData);
}
详细的可以参照QT assistant当中的 QProcess类的start函数
ljSilence 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

谢谢楼上各位的回答!
现在自己已经找到解决方案!
自己使用C编写嗅探程序,生成可执行文件。

然后在QT当中调用该可执行文件,并将其输出定向到界面上就好了!
[/Quote]楼主具体怎么做的啊?求解。。。
pengcao89 2012-04-21
  • 打赏
  • 举报
回复
谢谢楼上各位的回答!
现在自己已经找到解决方案!
自己使用C编写嗅探程序,生成可执行文件。

然后在QT当中调用该可执行文件,并将其输出定向到界面上就好了!
Emnkcn 2012-03-02
  • 打赏
  • 举报
回复
我也做过qt+pcap,我没用这个loop函数,而是用的pcap_next_ex这个函数,楼主可以去查一下,把这个函数放到一个额外的线程里抓包,然后把抓到的包返回比较容易实现
pengcao89 2012-02-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangxkww 的回复:]

我原来也做过Qt+libpcap,当时我处理这个问题的时候,

首先定义一个数据处理类,

是在类中定义一个静态成员函数,作为callback函数

,然后你懂的,这个静态成员函数所用到的成员变量也要声明为静态的。

然后继承QThread定义一个线程类,线程里run pcap_loop(),

抓到数据后我是通过postEvent将数据发送给主线程并显示的,信号槽没试过……
[/Quote]

可以说的详细一点儿么?
pengcao89 2012-02-22
  • 打赏
  • 举报
回复
能否说的详细点儿呵
wangxkww 2012-02-21
  • 打赏
  • 举报
回复
我原来也做过Qt+libpcap,当时我处理这个问题的时候,

首先定义一个数据处理类,

是在类中定义一个静态成员函数,作为callback函数

,然后你懂的,这个静态成员函数所用到的成员变量也要声明为静态的。

然后继承QThread定义一个线程类,线程里run pcap_loop(),

抓到数据后我是通过postEvent将数据发送给主线程并显示的,信号槽没试过,那就是线程间通信的问题了,应该问题不大

基本就是这个样子,程序运行稳定。

至于这种做法好不好,不敢多说,毕竟在多线程里使用static变量感觉不太舒服……

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧