pcap_if_t是一个interface数据结构,表明网络接口的信息。网络接口就是interface,就是我们用来上网的设备,一般为网卡,还有一些虚拟网卡也算作这样的接口。它的结构如下:

struct pcap_if {
struct pcap_if *next;
char *name;
char *description;
struct pcap_addr *addresses;
u_int flags;
}; typedef struct pcap_if pcap_if_t;

其中的struct pcap_addr为:

 struct pcap_addr {
struct pcap_addr *next;
struct sockaddr *addr;
struct sockaddr *netmask;
struct sockaddr *broadaddr;
struct sockaddr *dstaddr;
};

当我们要获网络接口的时候,这个数据结构是非常重要的。

这里只说Local host的设备的获取,对于远程设备,虽然有方法可以获取,不过我试了试,总是出错。

首先使用pcap_createsrcstr()函数来初始化一个source,指明我们在哪里查找设备,可以是本地机器,可以是远程机器,可以是本地文件夹(这样找的就是存储好的tcpdump的数据文件)。其函数原型如下:

int 	pcap_createsrcstr (char *source, int type, const char *host, const char *port, const char *name, char *errbuf)

1、source就是我们要存储的位置信息。

2、type有本地文件、本地机器、远程机器可供选择,分别为:PCAP_SRC_FILE, PCAP_SRC_IFLOCAL, PCAP_SRC_IFREMOTE

3、host是远程机器的名字,可以是"1.2.3.4”这样,也可以是"a.com”这样。本地为NULL。

4、port为远程端口。本地为NULL。

5、name为接口的名字。比如eth0。一般为NULL。如果是本地文件就是本地文件夹地址。

6、errbuf存储错误信息。

然后使用函数pcap_findalldevs_ex()这个函数来获取网络设备,其原型如下:

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

1、source可以使用上面设置好的source,也可以使用:PCAP_SRC_FILE_STRING 或者 PCAP_SRC_IF_STRING,分别是文件和接口的字符串。"file://",
"rpcap://"。

2、auth是远程登录信息,有用户名、密码、类型。用户名和密码都是字符指针,类型有:RPCAP_RMTAUTH_NULL 和 RPCAP_RMTAUTH_PWD。参看这里

3、alldevs用于存储返回的接口信息。我们要事先定义pcap_if_t *alldevs,这是一个链表,存储接口信息。

4、errbuf出错信息。

这样所获得的alldevs就是一个接口的链表,如果是文件就是一个文件的链表。我们就可以用指针对这些链表进行操作了。

最后不用这些设备的时候要把他们释放掉,使用函数pcap_freealldevs(),其原型如下:

void 	pcap_freealldevs (pcap_if_t *alldevsp)

附上一个源代码:

#include "pcap.h"

int main()
{
pcap_if_t *alldevs; // pcap_if_t is interface type
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE]; // store error information
int i;
// struct pcap_rmtauth Ubuntu_cat;
char source[PCAP_BUF_SIZE]; if (pcap_createsrcstr(source, PCAP_SRC_FILE,
NULL, NULL,
"E:\\My Documents\\MyProgram\\WinPcapPro\\Read one packet\\Read one packet",
errbuf) == -1) {
printf("Error in create source string: %s\n", errbuf);
exit(-1);
} printf("%s\n", source); if(pcap_findalldevs_ex(source, // can be PCAP_SRC_IF_STRING for local host
NULL, // auth to remote host. NULL if local host
&alldevs,
errbuf) == -1) {
printf("Error in find all devices: %s\n", errbuf);
exit(1);
} d = alldevs;
while(d != NULL) {
printf("%s\n%s\nAddress: ", d->name, d->description);
for (i = 0; d->addresses != NULL && i < 14; i++)
printf("%d ", d->addresses->addr->sa_data[i]);
printf("\n\n");
d = d->next;
} pcap_freealldevs(alldevs); return 0;
}

【VS开发】使用WinPcap编程(1)——获取网络设备信息的更多相关文章

  1. winPcap编程之获取适配器信息(二)

    首先要读一下这一页的东西:http://www.winpcap.org/docs/docs_412/html/group__wpcapsamps.html 可以结合中文版本看http://www.fe ...

  2. SharePoint 2013 APP 开发示例 (二)获取用户信息

    SharePoint 2013 APP 开发示例 (二)获取用户信息 这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的  SharePo ...

  3. C# 通过豆瓣网络编程API获取图书信息

    这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源代码,再通过正則 ...

  4. python 面向对象编程、获取对象信息

    面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...

  5. Android开发之多媒体编程之获取图片的副本

    使用BitmapFactory的decodeFile()方法获取的Bitmap对象是只读的,无法进行编辑操作 需要进行编辑的话,需要获取到该对象的一个副本 代码如下: import android.a ...

  6. winPcap编程之获取适配器详细信息(三)

    显示适配器详细信息 先贴上代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #includ ...

  7. winpcap编程设置过滤器之指定获取某个网站的数据

    下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据. 游戏图: 我是乱世隋唐的网址是:www.917st.com 这个是官网网址的服务器地址.  42.62.0.14 我玩的游戏服是84区.网 ...

  8. WinPcap编程入门实践

    转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...

  9. linux服务器开发三(网络编程)

    网络基础 协议的概念 什么是协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则. 假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名 ...

随机推荐

  1. Java 接口和内部类

    接口的方法默认死public,接口的属性默认为public static final. 为什么要接口,而不是使用抽象类.一个对象只能继承一个类,却可以实现多个接口. clone: Object的浅拷贝 ...

  2. Puppet利用Nginx多端口实现负载均衡

    随着公司应用需求的增加,需要不断的扩展,服务器数量也随之增加,当服务器数量不断增加,我们会发现一台puppetmaster压力大,解析缓慢,而且时不时出现"time out"之类的 ...

  3. “_MSC_VER”的不匹配项

    近些年来vs更新步伐加快,深刻的感受到了技术成长学习的重要性. 另一方面,版本的更换,也带来了许多的问题.今天用2019打开以前2010的工程时就碰到了一个: 检测到“_MSC_VER”的不匹配项: ...

  4. html applet标签 语法

    html applet标签 语法 作用:定义嵌入的 applet. 说明:某些浏览器中依然存在对 <applet> 但是需要额外的插件和安装过程才能起作用.大理石机械构件 注释:HTML5 ...

  5. php中文件断点上传怎么实现?

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  6. string [线段树优化桶排]

    题意大概是给你一个字符串,1e5次修改,每次给一个区间升序排列或降序排列,最后输出这个字符串; 其实是个挺裸的线段树优化题;但是我没有意识去结合桶排,扑该..... 首先 1.40分算法 O(NMlo ...

  7. 2019.9.16JAVA课堂作业

    public class TestDouble {     public static void main(String args[]) {        System.out.println(&qu ...

  8. springboot切换配置

    1.默认只有一个application.properties文件 1)删除properties文件,换成yml方式.新增dev,prod两个文件 2)配置application.yml文件:actio ...

  9. NOIP2002-字串变换【双向BFS】

    NOIP2002-字串变换 Description 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规 ...

  10. js中Array方法归类解析

    为什么要对Array方法进行归类解析 因为它常用,而且面试必问 改变原数组的方法 pop 删除并返回数组最后一个元素push 从末尾给数组添加元素,返回新数组length值reverse 颠倒数组元素 ...