0.

按着文档顺序写的。

开发环境:win10+VS2013。

配置WinPcap环境就不多说。直接给网址:http://blog.sina.com.cn/s/blog_57432f380101qh3n.html

内容大多是函数解释+碰到的问题的解决方案。学习&&警示。

1.获取适配器列表

  获取适配器的目的是:获取本机有哪些适配器,便于之后选择用哪个适配器抓包。

  首先,先了解一个数据类型pcap_if/pcap_if_t,这是一个链表结构,用来存储本机的所有适配器。

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

备注:

  第一是一个pcap_if的链表指向下一个设备接口;

  第二个是设备的实际的名字,这个名字是机器能识别的名字,供pcap_open_live()调用;

  第三个是设备的文本描述符,这个描述符就是人们能够识别的文本符号;有可能为null。

  第四个是一个地址指针,指向的是一系列接口(pcap_addr)的第一个指针;

  第五个是一个标志位,目前这个标志位主要是不是loopback设备。

  

  然后,获取适配器列表的函数是:

int pcap_findalldevs_ex ( char * source ;

 struct pcap_rmauth * auth;

 pcap_if_t ** alldevs;

 char * errbuf;

)

备注:

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

2.auth是远程登录信息(pcap_rmauth),有用户名、密码、类型。用户名和密码都是字符指针,类型有:RPCAP_RMTAUTH_NULL 和 RPCAP_RMTAUTH_PWD。多为BULL。

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

4.errbuf出错信息。

  5.返回值为0则顺利;-1代表出现错误。

  最后,释放设备函数:

void pcap_freealldevs (pcap_if_t *alldevsp)

  释放内存。

  原装代码:

#define WIN32
#include "pcap.h" void main()
{
pcap_if_t *alldevs, *d;
int i = ;
char errbuf[PCAP_ERRBUF_SIZE];
/* PCAP_ERRBUF_SIZE =256在pcap.h中定义*/ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -) /* 这个API用来获得网卡的列表 */
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
//errbuf参数 当有异常情况发生时,这个参数会被PCAP填充为某3个特定的错误字串
return;
} /* 显示列表的响应字段的内容*/
for (d = alldevs; d; d = d->next)
{
printf("%d. %s,%s\n", ++i, d->name,d->addresses);
if (d->description) {
printf(" (%s)\n", d->description);
//system("pause");
}
else
printf(" (No description available)\n");
}
if (i == )
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
} /*We don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
system("pause");
}

  

2.获取适配器的高级信息。

  每一个pcap_if_t中包含一个pcap_addr。pcap_addr中包含这个设备的高级信息。

  

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

备注: 

  第二个,地址列表;

  第三个,掩码列表;

  第四个,广播地址列表;

  第五个,目的地址列表。

  然后,1中获得适配器列表的链表结构后,从头开始遍历,把pcap_if_t中pcap_addr的信息给输出出来就OK了。

  

#define WIN32
#include "pcap.h" #ifndef WIN32
#include <winsock.h>
#include <wininet.h>
#include <ws2def.h>
#include<WS2tcpip.h>
#else
#include <winsock.h>
#endif // 函数原型
void ifprint(pcap_if_t *d);
char *iptos(u_long in);
char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen); int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE + ];
char source[PCAP_ERRBUF_SIZE + ]; printf("Enter the device you want to list:\n"
"rpcap:// ==> lists interfaces in the local machine\n"
"rpcap://hostname:port ==> lists interfaces in a remote machine\n"
" (rpcapd daemon must be up and running\n"
" and it must accept 'null' authentication)\n"
"file://foldername ==> lists all pcap files in the give folder\n\n"
"Enter your choice: "); fgets(source, PCAP_ERRBUF_SIZE, stdin);
source[PCAP_ERRBUF_SIZE] = '\0'; /* 获得接口列表 */
if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -)
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
exit();
} /* 扫描列表并打印每一项 */
for (d = alldevs; d; d = d->next)
{
ifprint(d);
} pcap_freealldevs(alldevs); system("pause");
return ;
} /* 打印所有可用信息 */
void ifprint(pcap_if_t *d)
{
pcap_addr_t *a;
char ip6str[]; /* 设备名(Name) */
printf("%s\n", d->name); /* 设备描述(Description) */
if (d->description)
printf("\tDescription: %s\n", d->description); /* Loopback Address*/
printf("\tLoopback: %s\n", (d->flags & PCAP_IF_LOOPBACK) ? "yes" : "no"); /* IP addresses */
for (a = d->addresses; a; a = a->next) {
printf("\tAddress Family: #%d\n", a->addr->sa_family); switch (a->addr->sa_family)
{
case AF_INET:
printf("\tAddress Family Name: AF_INET\n");
if (a->addr)
printf("\tAddress: %s\n", iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
if (a->netmask)
printf("\tNetmask: %s\n", iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
if (a->broadaddr)
printf("\tBroadcast Address: %s\n", iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
if (a->dstaddr)
printf("\tDestination Address: %s\n", iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
break; case AF_INET6:
printf("\tAddress Family Name: AF_INET6\n");
if (a->addr)
printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
break; default:
printf("\tAddress Family Name: Unknown\n");
break;
}
}
printf("\n");
}
/* 将数字类型的IP地址转换成字符串类型的 */
#define IPTOSBUFFERS 12
char *iptos(u_long in)
{
static char output[IPTOSBUFFERS][ * + + ];
static short which;
u_char *p; p = (u_char *)&in;
which = (which + == IPTOSBUFFERS ? : which + );
sprintf_s(output[which], "%d.%d.%d.%d", p[], p[], p[], p[]);
return output[which];
} char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
{
socklen_t sockaddrlen; #ifdef WIN32
sockaddrlen = sizeof(struct sockaddr_in6);
#else
sockaddrlen = sizeof(struct sockaddr_storage);
#endif if (getnameinfo(sockaddr,
sockaddrlen,
address,
addrlen,
NULL,
,
NI_NUMERICHOST) != ) address = NULL; return address;
}

辅助函数,IP转字符串

WinPcap编程(一)的更多相关文章

  1. WinPcap编程入门实践

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

  2. WinPcap编程(二)

    0. 这一次具体讲抓包的两种方法. (建议)清除ARP表,最好自己写个批处理命令.快一点. 1.0 抓包步骤 步骤很简单:先打开适配器列表 --> 选择适配器 --> 通过遍历链表的方式到 ...

  3. winPcap编程之环境搭建(一)

    之前用winPcap做过一个拦截网络数据包的程序,作为当时的网络编程课程的课程设计,现在重新学习一下. 工具:codeblocks 要用到的一些东西:WinPcap.exe与winPcap一些库文件 ...

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

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

  5. WinPcap编程(三)

    1.过滤器设置 设置过滤器,得到你想要的哪种类型的包.Like WireShark. 过程:编译过滤器,然后设置过滤器.直接上参考文档的代码: if (d->addresses != NULL) ...

  6. WinPcap编程(前言&&学习)

    计算机网络课设要求用WinPcap写对ARP包的接收与发送. 所以学了一下WinPcap的内容. 参考的博客: http://blog.csdn.net/htttw/article/details/7 ...

  7. c语言Winpcap编程构造并接收解析arp包

    /* 程序功能: 1.构造arp包,并发送.程序参数顺序:源IP.目的IP.mac地址.flag 2.获取网络中的ARP数据包,解析数据包的内容.程序参数:日志文件名 winpacp中文技术文档(基本 ...

  8. [补] winpcap编程——EAP协议与EAPSOCKET实现

    EAP SOCKET Implement Mentohust 时间:20161115,大二上 ## 准备. 什么是 EAP 协议 ? WIKI : https://en.wikipedia.org/w ...

  9. winPcap编程之不用回调方法捕获数据包(五 转)

    这一次要分析的实例程序跟上一讲非常类似(“打开适配器并捕获数据包”),略微不同的一点是本次将pcap_loop()函数替换成了pcap_next_ex()函数.本节的重点也就是说一下这两个函数之间的差 ...

随机推荐

  1. 正则表达式中Pattern类、Matcher类和matches()方法简析

    1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.  它包括两个类:Pattern和Matcher . Pattern: 一个Pattern是一 ...

  2. 找出Active Directory架构操作主机方法!

  3. c++文件流

    前言 文件流能够从文件系统中读取数据并向文件中写入数据. 文件输入流适用于读取配置数据.读取保存的文件以及批处理基于文件的数据等任务.Fprintf,fwrite,fputs 文件输出流适用于保存状态 ...

  4. MYSQL ERROR CODE 错误编号的意义

    mysql error code(备忘) 转1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件 ...

  5. 常用的js效验

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 【课程分享】Oracle数据库系统project师

    对这个课程有兴趣的朋友能够加我的QQ2059055336和我联系 一.本课程是怎么样的一门课程 1.1.课程的背景 该课程是Oracle数据库系统project师培训课程 Oracle Databas ...

  7. 语音控制的tab选项卡

    前端开发whqet,csdn,王海庆,whqet,前端开发专家 ladies and 乡亲们,程序猿同志们,周末仍然坚守工作岗位,或者学习不辍的童鞋们,福音来了. 语音识别高不高端.难不难? 今天给大 ...

  8. hdu 3720 Arranging Your Team 枚举

    不可能解可以直接判断. 搭配产生的附加分可以用一个二维数组保存. 枚举1442,4种类型的人,因为总人数只有23个,所以可以搜索暴力枚举,然后保存最优解. 注意trick,答案可能为负数,所以初始化a ...

  9. qt 工具栏和菜单栏

    在前面的QMainWindow的基础之上,我们开始着手建造我们的应用程序.虽然现在已经有一个框架,但是,确切地说我们还一行代码没有写呢!下面的工作就不那么简单了!在这一节里面,我们要为我们的框架添加菜 ...

  10. spring mvc DispatcherServlet详解之拾忆工具类utils

    DispatcherServlet的静态初始化 /** * Name of the class path resource (relative to the DispatcherServlet cla ...