WinPcap网络编程入门——1. 获取设备列表

系列教程章节直达:
Winpcap网络编程入门——1. 获取设备列表;


上节中我们简单介绍了 WinPcap 的相关资料,配置好了开发环境,现在就让我们正式开始网络编程开发吧!

1. 基本开发流程

WinPcap 开发网络应用程序的大致流程:首先获取主机安装的网络设备列表,然后选择并激活某个网络设备,封装或过滤数据包,发送或解析数据包,本节我们将以解析数据包为例来逐层深入,基本开发流程如图:

2. 使用 pcap_findalldevs_ex() 检索设备列表

pcap_findalldevs_ex() 是 WinPcap 提供的用以查找主机网络适配器功能的函数,它是 pcap_findalldevs() 函数的升级版,现在基本都选择使用 ex 版本,它不仅能查找本地的设备,还能查找远程的设备,关于此函数的定义如下:

// 函数原型:
int pcap_findalldevs_ex(char* source,  struct pcap_rmtauth *auth,  pcap_if_t** alldevs,   char* errbuf);
/* 参数说明
* source:指定是本地适配器还是远程适配器
* auth:身份验证信息,可以为NULL
* alldevs:存放获取的适配器数据,如果查找失败,其值为NULL
* errbuf:存放查找失败的相关错误信息
*/
// 返回值:成功返回0,失败返回-1

看了函数定义之后是不是感觉这个很简单呢,只需要调用函数然后就可以获取到设备信息,是的!就是这么简单,当然,还有一点需要注意:
可以看到参数 alldevs的类型是 pcap_if_t类型的二级指针,这里需要说明,pcap_findalldevs_ex()函数在获取到设备信息之后会将详细信息存储在一个结构体pcap_if_t中,(注意,单个设备时一个结构体,多个设备就是多个结构体的链接,即链表,这是个非常基本的概念,不懂的话查一下链表的相关知识)它的定义如下:

struct pcap_if_t
{struct pcap_if_t *next;        // 如果不为空,就指向下一个元素char *name;                 // 设备名称char *description;           // 设备描述struct pcap_addr *addresses;// 接口地址列表bpf_u_int32 flags;          // 标志位,标志是否 loopback 设备
}

从中可以看出,我们需要建立一个pcap_if_t类型的指针来存储调用函数获取到的设备信息,然后直接通过指针就可以访问指定设备的相关信息,由此可以写出伪代码如下:

pcap_if_t *alldevs;  // 指向获取到设备列表的第一个设备,即链表头
pcap_findalldevs_ex(***, ***, alldevs, ***);    // 调用函数来查找设备
printf("%s\n", alldevs->name);         // 输出第一个设备的名称
printf("%s\n", alldevs->description);  // 输出第一个设备的描述信息
if(alldevs 链表中有多个设备)alldevs = alldevs->next;    // 获取下一个设备// 重复上面的输出代码,输出此设备的相关信息

同样,从pcap_if_t结构体的定义中可以看到,在结构体里面又定义了一个名为pcap_addr的结构体,用来存储接口地址列表,pcap_addr的定义如下:

struct pcap_addr
{struct pcap_addr *next;            // 如果不为空,则指向下一个元素struct sockaddr *addr;          // 接口IP地址struct sockaddr *netmask;      // 接口网络掩码struct sockaddr *broadaddr;        // 接口广播地址struct sockaddr *dstaddr;      // 接口 P2P 目的地址
}

这个结构体的列表中包含:

  • 该接口的地址列表
  • 网络掩码的列表(每个网络掩码对应地址列表中的一项)
  • 广播地址的列表(每个广播地址对应地址列表中的一项)
  • 目标地址的列表(每个目标地址对应地址列表中的一项)

3. 实现获取设备列表

经过了以上的分析,我们大概知道了pcap_findalldevs_ex()函数的基本用法以及对于信息的存储机制,下面我们就来实现一下这个程序吧,具体的解释都在代码的注释里,要详细阅读代码哟 ~

#define WIN32                        // 在vs中编程时,必须要加这一行,否则vs不会自动识别平台
#include <stdio.h>
#include <pcap.h>
#pragma comment(lib, "wpcap.lib")main()
{pcap_if_t* alldevs, * d;       // alldevs 存储查找到的设备链表的链表头,d 为遍历 alldevs 链表时的游标int i = 0;                        // 设备序号,在后面的循环中会用到char errbuf[PCAP_ERRBUF_SIZE]; // 如果查找失败,相关错误信息会存储到这个里面// 从本地计算机检索可用设备列表if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){// 查找失败,输出失败信息fprintf(stderr, "Error in pcap_findalldevs_ex: %s\n", errbuf);exit(1);      // 如果查找失败,程序直接终止}// 如果查找成功,alldevs 中已经存储了设备信息链表头的地址,直接遍历输出即可// 输出设备列表for (d = alldevs; d != NULL; d = d->next){printf("%d.%s", ++i, d->name);                 // 输出设备名称,设备序号依次加1if (d->description){printf("(%s)\n", d->description);          // 输出设备描述信息(如果有的话)}else {printf("(No description available)\n");}}if (i == 0)     // 如果设备序号还是0的话,说明没有查找到设备{printf("\nNo interfaces found! Make sure Winpcap is installed.\n");return;}// 释放设备pcap_freealldevs(alldevs);
}

完整代码就是这样,如果有其他问题欢迎下方评论区相见。


系列教程章节直达:
Winpcap网络编程入门——1. 获取设备列表;

WinPcap网络编程入门——1. 获取设备列表相关推荐

  1. WinPcap网络编程入门——0. 环境配置及系列介绍

    WinPcap网络编程入门--0. 环境配置及系列介绍 系列教程章节直达: Winpcap网络编程入门--1. 获取设备列表: 说明:本教程适用于网络编程开发人员入门,将从底层分析 WinPcap 的 ...

  2. WinPcap笔记(2):获取设备列表

    通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器列表.WinPcap提供了pcap_findalldevs_ex()函数来实现这个功能:返回一个pcap_if结构的链表,这 ...

  3. Linux网络编程 入门

    Linux网络编程入门 (转载) (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端          网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  4. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  5. Day14.网络编程入门及其应用

    网络编程入门及其应用 文章目录 网络编程入门及其应用 前言 一. 网络编程的入门 1.1 计算机网络基础 1.2 计算机网络发展史 1.3 TCP/IP模型 1.4 网络应用模式 二. 基于HTTP协 ...

  6. Day14:网络编程入门

    网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机网络中的设备和计算机网络的用户已经多得不可计数 ...

  7. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  8. 网络编程入门从未如此简单(一):假如你来设计网络,会怎么做?

    本文原题"如果让你来设计网络",有修订和改动,收录已征得作者同意,转载请联系作者.本文已同步发布于52im社区:http://www.52im.net/thread-3330-1- ...

  9. Java网络编程(一)网络编程入门知识

    文章目录 第一章 Java网络编程入门 1.前言 1.1 进程之间的通信 1.2 计算机网络概念 1.3 网络模型之OSI参考模型 1.4 TCP/IP参考模型和TCP/IP协议 1.4.1 模型解析 ...

最新文章

  1. jqGrid edit总结
  2. python 鱼c工作室作业_鱼C工作室Python作业
  3. 操作系统:Win10的沙盒是什么,如何使用,看完你就懂了!
  4. 何以笙箫默,一部有剧情的创意广告集?
  5. python协程调度方式_python 3.x 学习笔记17(协程以及I/O模式)
  6. python运算优先级
  7. USB VIDPID 表
  8. Word另存为PDF时,将目录转换为PDF书签
  9. 肌肤食品揭秘淘宝骗子经典伎俩
  10. 使用 Blastp 和 Hmmer 筛选出包含特定结构域的蛋白
  11. 全国DNS服务器地址备忘录
  12. 北京协和医学院823计算机原理,2017年北京协和医学院病原生物学研究所823计算机原理考研仿真模拟题...
  13. 支付宝h5网页的支付
  14. Window10设置图标名、文件名的字体大小方法
  15. 计算机上无线网络开关在哪里,台式电脑wifi开关在哪
  16. 驱动调试-摄像头部分
  17. 项目启动图片验证码加载不出来
  18. Web前端深色模式适配方案
  19. 广联达GTJ2018实战精准快速算量课程
  20. PhotoShop CS2下载地址 + 素材(笔刷,字体,滤镜)安装说明

热门文章

  1. 蜗牛星际C单黑群晖加USB网卡做链路聚合
  2. 2019聊聊我所了解的“设计规范”
  3. 这一次,彻底入门前端测试,覆盖单元测试、组件测试(2.4w 字)
  4. 转载! ----上海,我的奋斗岁月----
  5. java 数组 初始化 个数_Java中数组的初始化
  6. python爬虫--xpath模块简介
  7. anaconda pytorch jupyter安装出的所有问题
  8. Python电力系统分析包PyPsa样例代码
  9. 【转】如何保护自己的QQ号
  10. cmd命令进入mysql数据库_cmd命令怎么打开mysql?