码迷,mamicode.com
首页 > Windows程序 > 详细

WinPcap编程(一)

时间:2015-08-15 11:42:56      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

 

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; 
View Code

备注:

  第一是一个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;

)
View Code

备注:

  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)
View Code

  释放内存。

 

  原装代码:

技术分享
#define WIN32
#include "pcap.h" 

void main()
{
    pcap_if_t *alldevs, *d;
    int i = 0;
    char errbuf[PCAP_ERRBUF_SIZE];
    /* PCAP_ERRBUF_SIZE =256在pcap.h中定义*/

    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) /* 这个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 == 0)
    {
        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");
}
View Code

 

WinPcap编程(一)

标签:

原文地址:http://www.cnblogs.com/treeLikeStar/p/4732033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!