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

article/2025/9/26 16:54:38

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. 获取设备列表;


http://chatgpt.dhexx.cn/article/1IgMlveP.shtml

相关文章

网络编程入门(代码很详细)

网络编程 1.1概述 计算机网络&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算…

网络编程——(1)网络编程入门

一、软件架构 1.1C/S结构&#xff1a; 全称Client/Server结构&#xff0c;是指客户端和服务器结构。常见的程序有QQ、迅雷等。 1.2 B/S结构&#xff1a; 全称为Browser/Server结构&#xff0c;是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势&#xf…

网络编程入门

1.网络编程入门 1.1网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统 网…

线性代数学习笔记——第六讲——矩阵的转置

1. 矩阵转置的定义&#xff08;矩阵的行和列互换位置&#xff09; 2. 矩阵转置的性质之一&#xff1a;矩阵转置一次后再转置一次&#xff0c;等于矩阵自身&#xff08;有点像一个两状态开关&#xff0c;在开与关之间来回切换&#xff09; 3. 对称矩阵的充要条件是矩阵转置一次后…

转置矩阵、对称矩阵、反对称矩阵以及向量的反对称矩阵

一、转置矩阵 假设矩阵 A 如下表示&#xff1a; 则其转置矩阵表示为&#xff1a; 二、对称矩阵 若矩阵 B 与其转置矩阵相等&#xff0c;则称矩阵 B 为对称矩阵&#xff0c;如&#xff1a; 三、反对称矩阵 若矩阵 C 与其转置矩阵取负后相等&#xff0c;则称矩阵 C 为反对称矩…

Java编程之转置矩阵

一、题目 利用随机函数产生36个10~30之间的整数给一个6*6的矩阵赋值。 &#xff08;1&#xff09;求最大元素&#xff0c;并指出其在矩阵中的所有出现位置&#xff1b; &#xff08;2&#xff09;求该矩阵的转置矩阵。 二、实验代码 package fighting; import java.util.Rand…

FPGA 矩阵转置

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference 1 功能 通过tb读取本地数据保存到FIFO&#xff0c…

MATLAB的转置

小席的碎碎叨&#xff1a;   以前处理的数据通常都是实数矩阵&#xff0c;一直认为MATLAB中的转置可用实现&#xff0c;并没有发现有什么不对。但是&#xff0c;这段时间在做线性调频信号的干扰抑制的仿真&#xff0c;其信号矩阵都是复数矩阵&#xff0c;依然在需要转置的时候…

矩阵转置(transpose、T)

1.T T 适用于一、二维数组的转置 transpose 适用于高维数组&#xff0c;需要用到一个由轴编号组成的元组&#xff0c;才能进行转置 In [1]: import numpy as npIn [2]: arr np.arange(20).reshape(4,5)#生成一个4行5列的数组In [3]: arr Out[3]: array([[ 0, 1, 2, 3, 4]…

线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)

这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T*齐次坐标V 齐次坐标V 其计算细节也就是矩阵行与向量列的点积&#xf…

转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

转载自: https://blog.csdn.net/yinhun2012/article/details/84236202 这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T…

转置矩阵(Transpose of a matrix)

定义 给定一个矩阵 A&#xff0c;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff0c;记为 &#xff0c;。转置矩阵的行列式不变&#xff0c;即 。转置矩阵由下列动作建立&#xff1a; 将 A 的横行写为 的纵列&#xff1b;将 A 的纵列写成 的横行。 形式来说&#xff0…

数据结构--3.3 矩阵转置

矩阵转置 结构体创建初始化转置打印测试代码运行结果 1.稀疏矩阵的压缩存储&#xff0c;至少需要存储以下信息&#xff1a; 矩阵中各非 0 元素的值&#xff0c;以及所在矩阵中的行标和列标&#xff1b; 矩阵的总行数和总列数&#xff1b; 上图是一个稀疏矩阵&#xff0c;若对…

D2D与其他短距离通信技术

本篇文章主要对D2D和其他短距离通信技术&#xff08;WIFI\NFC\zigbee\蓝牙、超宽带、微站&#xff09;做了比较&#xff0c;从运营商投入、基础设施、应用、最大传输速率、最大传输距离、频率、标准、特征等方面

D2D引擎与GDI\GDI+绘制效果对比

本例主要是对比D2D和GDI在绘制文字、线条的区别&#xff0c;以及D2D与GDI在绘制图片时的区别。 D2D是基于COM组件开发的&#xff0c;使用前的CoInitialize(NULL)是必须的&#xff1b;另外&#xff0c;GDI的初始化GdiplusStartup&#xff08;&#xff09;也别忘了。 废话少说&…

D2D加载图片资源(2)

※先给大家认识下什么是WIC WIC全称是Windows Image Component&#xff0c;是一套扩展的API&#xff0c;用来处理数字图像&#xff0c;它是基于COM组件的。该API包含非常丰富的图像处理函数。 详细可以点击百度文库再看看 http://baike.baidu.com/view/414115.htm?fraladdi…

5G关键技术,D2D通信-ielab

D2D&#xff08;device to device&#xff09;技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分散式网路中&#xff0c;每个用户节点都能发送和接收信号&#xff0c;并具有自动路由(转发消息)的功能。网路的参与者共用它们所拥有的一部分硬…

D2D D3D12 渲染视频帧思路及实现

写在之前 耗时2个月&#xff0c;写完公司的音视频处理系统。对于整个音视频处理有了基本的了解。个人感觉最坑的地方有三&#xff1a; 编解码音视频录制的同步视频预览渲染&#xff08;视频帧的渲染&#xff09; 由于在以后要支持同时多路1080P录制及预览&#xff0c;所以对…

车载通信与导航(五):D2D通信流程

取自https://blog.csdn.net/u012159948/article/details/20059927 D2D技术可以应用于移动蜂窝网络&#xff0c;以提高资源利用率和网络容量。每一个D2D通信链路占用的资源与一个蜂窝通信链路占用的相等。D2D通信将在宏蜂窝基站的控制下获得通信所需的频率资源和传输功率。它与蜂…

关于字体绘制的baseline (QT 和 D2D)

常规字体绘制API调用: QT:QPainter::drawText D2D: ID2D1RenderTarget::DrawText 以上字体绘制某些特殊效果无法达到, 我们可以用Path绘制字体: QPainterPath::addText(qreal x, qreal y, const QFont &f, const QString &text); D2D: 将字用指定字体属性绘制好,…