lvxuzhou


私信TA

用户名:lvxuzhou

访问量:106753

签 名:

lvxuzhou

等  级
排  名 47
经  验 12168
参赛次数 0
文章发表 56
年  龄 0
在职情况 学生
学  校 西安
专  业

  自我简介:

开发环境准备:
1、安装 WinPcap_4_1_3.exe 驱动

2、WinPcap开发包

3、QT6开发环境

4、参考博客:https://www.cnblogs.com/blacksword/archive/2012/03/10/2388848.html

第一步、配置QT环境

QQ图片20211101222431.jpg

1、 如果你的程序使用了WinPcap的远程捕获功能,那么在预处理定义中加入HAVE_REMOTE。不要直接把remote-ext.h直接加入到你的源文件中去,就是说它的作用相当于是包含了remote-ext.h这个头文件,至于为何不直接把这个头文件包含起来

第二步、测试代码:

#include "pcap.h"

#include <QCoreApplication>
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  pcap_if_t *alldevs;
  pcap_if_t *d;
  int i = 0;
  char errbuf[PCAP_ERRBUF_SIZE];

  /* 获取本地机器设备列表 */
  if (pcap_findalldevs_ex((char *)PCAP_SRC_IF_STRING,
                          NULL /* auth is not needed */, &alldevs,
                          errbuf) == -1) {
    fprintf(stderr, "Error in pcap_findalldevs_ex: %s\n", errbuf);
    exit(1);
  }

  /* 打印列表 */
  for (d = alldevs; d != NULL; d = d->next) {
    printf("%d. %s", ++i, d->name);
    if (d->description)
      printf(" (%s)\n", d->description);
    else
      printf(" (No description available)\n");
  }

  if (i == 0) {
    printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
    return 1;
  }

  /* 不再需要设备列表了,释放它 */
  pcap_freealldevs(alldevs);
  return a.exec();
}

1、结构体指针pcap_if_t*的声明,转到pcap_if_t的声明处我们看到在"pcap.h"中有一句 typedef struct pcap_if pcap_if_t;

 pcap_if这个结构体是用来做什么的呢?查看文档我们不难发现,它包含了一个适配器的详细信息,其中的数据域name和description表示一个适配器名称和一个可以让人们理解的描述。而之所以定义结构体指针,因为其实定义的是pcap_if结构的链表。链表我们是再熟悉不过了!接下去分析,PCAP_ERRBUF_SIZE是宏定义的,值为256。然后我们看到了pcap_findalldevs_ex这么一个函数,函数的功能就是返回一个pcap_if结构的链表。函数的完整声明如下所示:

int pcap_findalldevs_ex  ( char *  source,  
 struct pcap_rmtauth *  auth,  
 pcap_if_t **  alldevs,  
 char *  errbuf  
)

2、第一个参数是一个字符指针,保存的是source的地址,事实上它决定了source的类型(file, remote/local interface),而PCAP_SRC_IF_STRING表示用户希望从一个网络接口卡打开捕获(open a capture from a network interface)。

      第二个参数是一个pcap_rmtauth的结构体指针,它保存了RPCAP连接远程用户的验证信息,因为是要获取本地的设备列表,这个参数就没有意义,置为NULL。

      第三个参数刚才已经说了,这个函数的功能就是返回一个pcap_if结构的链表,给的是链表的地址,所以在源码中看到写的是“&alldevs”。

      第四个参数是错误信息缓冲,就是说如果这个函数调用出错则把错误信息保存到这个buff里面。

      pcap_findalldevs_ex函数的返回值为0,说明everything is fine,返回-1则表示出错。

      接下来的代码就没什么好说的了。但注意最后有一个pcap_freealldevs的函数,它的功能显而易见,就是释放链表的空间咯!

      最后看一下在本机运行后的结果。显示的是本机连接的设备信息,当然我们看到设备的名称都是以rpcap://打头的,其实就是源码中用到的PCAP_SRC_IF_STRING,这应该是RPCAP协议所定义的格式,这里就不深究了。

第三步、运行结果:

QQ图片20211026231104.png

可以看到有6个设备和我电脑的网络设备个数一致。

QQ图片20211026231104.png


 

0.0分

1 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »