原文链接地址:http://www.cnblogs.com/phinecos/archive/2008/10/20/1315176.html

Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。

首先到http://www.winpcap.org/install/default.htm下载安装winpcap 驱动和DLL组件。

然后到http://www.winpcap.org/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:\WpdPack_4_0_2\WpdPack,可以看到里面包含了:Lib,Include,文档和示例程序。

 

首先创建一个C++控制台程序,设置如下:

1) 在“Configuration Properties -> C/C++ -> General”中,在Additional Include Directories加入Include路径(“C:\WpdPack_4_0_2\WpdPack\Include”)。

2) 在 “Configuration Properties -> Linker -> General” 中,在Additional Library Directories中加入 winpcap 库文件路径 ( “C:\WpdPack_4_0_2\WpdPack\Lib” ) 。

3) 在“Configuration Properties -> Linker -> Input”中, Additional Dependencies 加入用到的两个winpcap 库文件(wpcap.lib and Packet.lib ) 。

4) 为了使用Winpcap的远程访问,必须在预处理器中加入HAVE_REMOTE


示例程序1 获取适配器列表

#include <pcap.h>

int _tmain(int argc, _TCHAR* argv[])

{

    pcap_if_t * allAdapters;//适配器列表

    pcap_if_t * adapter;

    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区

    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, 

                &allAdapters, errorBuffer ) == -1 )

    {//检索机器连接的所有网络适配器

        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );

        return -1;

    }

    if( allAdapters == NULL )

    {//不存在人任何适配器

        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );

        return 0;

    }

    int crtAdapter = 0;

    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)

    {//遍历输入适配器信息(名称和描述信息)

        printf( "\n%d.%s ", ++crtAdapter, adapter->name );

        printf( "-- %s\n", adapter->description );

    }

    printf( "\n" );

    pcap_freealldevs( allAdapters );//释放适配器列表

    system( "PAUSE" );

    return 0;

}

示例程序2 打开指定适配器并捕获数据包

#include <pcap.h>

int _tmain(int argc, _TCHAR* argv[])

{

    pcap_if_t * allAdapters;//适配器列表

    pcap_if_t * adapter;

    pcap_t           * adapterHandle;//适配器句柄

    struct pcap_pkthdr * packetHeader;

    const u_char       * packetData;

    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区

    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, 

                &allAdapters, errorBuffer ) == -1 )

    {//检索机器连接的所有网络适配器

        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );

        return -1;

    }

    if( allAdapters == NULL )

    {//不存在任何适配器

        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );

        return 0;

    }

    int crtAdapter = 0;

    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)

    {//遍历输入适配器信息(名称和描述信息)

        printf( "\n%d.%s ", ++crtAdapter, adapter->name ); 

        printf( "-- %s\n", adapter->description );

    }

    printf( "\n" );

    //选择要捕获数据包的适配器

    int adapterNumber;

    printf( "Enter the adapter number between 1 and %d:", crtAdapter );

    scanf_s( "%d", &adapterNumber );

    if( adapterNumber < 1 || adapterNumber > crtAdapter )

    {

        printf( "\nAdapter number out of range.\n" );

        // 释放适配器列表

        pcap_freealldevs( allAdapters );

        return -1;

    }

    adapter = allAdapters;

    for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ )

    adapter = adapter->next;

    // 打开指定适配器

    adapterHandle = pcap_open( adapter->name, // name of the adapter

                               65536,         // portion of the packet to capture

                                              // 65536 guarantees that the whole 

                          // packet will be captured

                               PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode

                               1000,             // read timeout - 1 millisecond

                               NULL,          // authentication on the remote machine

                               errorBuffer    // error buffer

                              );

    if( adapterHandle == NULL )

    {//指定适配器打开失败

        fprintf( stderr, "\nUnable to open the adapter\n", adapter->name );

        // 释放适配器列表

        pcap_freealldevs( allAdapters );

        return -1;

    }

    printf( "\nCapture session started on  adapter %s\n", adapter->name );

    pcap_freealldevs( allAdapters );//释放适配器列表

    // 开始捕获数据包

    int retValue;

    while( ( retValue = pcap_next_ex( adapterHandle, 

                      &packetHeader, 

                      &packetData ) ) >= 0 )

    {

        // timeout elapsed if we reach this point

        if( retValue == 0 )

                continue;

        //打印捕获数据包的信息

        printf( "length of packet: %d\n", packetHeader->len );

    }

    // if we get here, there was an error reading the packets

    if( retValue == -1 )

    {

        printf( "Error reading the packets: %s\n", pcap_geterr( adapterHandle ) );

        return -1;

    }

    system( "PAUSE" );

    return 0;

}

示例程序3 发送数据封包

#include <pcap.h>

int _tmain(int argc, _TCHAR* argv[])

{

    pcap_if_t * allAdapters;//适配器列表

    pcap_if_t * adapter;

    pcap_t           * adapterHandle;//适配器句柄

    u_char         packet[ 20 ]; //待发送的数据封包

    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区

    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, 

                &allAdapters, errorBuffer ) == -1 )

    {//检索机器连接的所有网络适配器

        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );

        return -1;

    }

    if( allAdapters == NULL )

    {//不存在人任何适配器

        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );

        return 0;

    }

    int crtAdapter = 0;

    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)

    {//遍历输入适配器信息(名称和描述信息)

        printf( "\n%d.%s ", ++crtAdapter, adapter->name ); 

        printf( "-- %s\n", adapter->description );

    }

    printf( "\n" );

    //选择适配器

    int adapterNumber;

    printf( "Enter the adapter number between 1 and %d:", crtAdapter );

    scanf_s( "%d", &adapterNumber );

    if( adapterNumber < 1 || adapterNumber > crtAdapter )

    {

        printf( "\nAdapter number out of range.\n" );

        // 释放适配器列表

        pcap_freealldevs( allAdapters );

        return -1;

    }

    adapter = allAdapters;

    for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ )

    adapter = adapter->next;

    // 打开指定适配器

    adapterHandle = pcap_open( adapter->name, // name of the adapter

                               65536,         // portion of the packet to capture

                                              // 65536 guarantees that the whole 

                          // packet will be captured

                               PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode

                               1000,             // read timeout - 1 millisecond

                               NULL,          // authentication on the remote machine

                               errorBuffer    // error buffer

                              );

    if( adapterHandle == NULL )

    {//指定适配器打开失败

        fprintf( stderr, "\nUnable to open the adapter\n", adapter->name );

        // 释放适配器列表

        pcap_freealldevs( allAdapters );

        return -1;

    }

    pcap_freealldevs( allAdapters );//释放适配器列表

    //创建数据封包

    // 设置目标的MAC地址为01 : 01 : 01 : 01 : 01 : 01

    packet[0] = 0x01;

    packet[1] = 0x01;

    packet[2] = 0x01;

    packet[3] = 0x01;

    packet[4] = 0x01;

    packet[5] = 0x01;

    // 设置源的MAC地址为02 : 02 : 02 : 02 : 02 : 02

    packet[6]  = 0x02;

    packet[7]  = 0x02;

    packet[8]  = 0x02;

    packet[9]  = 0x02;

    packet[10] = 0x02;

    packet[11] = 0x02;

    // 设置封包其他部分内容

    for( int index = 12; index < 20; index++ )

    {

        packet[index] = 0xC4;

    }

    //发送数据封包

    if( pcap_sendpacket( adapterHandle, // the adapter handle

             packet, // the packet
// the length of the packet ) != 0 ) { fprintf( stderr,"\nError sending the packet: \n", pcap_geterr( adapterHandle ) ); return -1; } system( "PAUSE" ); return 0; }

参考文章:

1,Introduction to the Winpcap Networking Libraries

2.中文手册:http://www.ferrisxu.com/WinPcap/html/index.html

Winpcap网络开发库入门的更多相关文章

  1. 网络开发库从libuv说到epoll

    引言 这篇博文可能有点水,主要将自己libuv的学习过程和理解. 简单谈方法. 有点杂. 那我们开始吧. 首先介绍 githup . 这个工具特别好用. 代码托管. 如果不FQ可能有点卡. 但是应该试 ...

  2. 接口测试入门(5)----新框架重构,使用轻量级的HTTP开发库 Unirest

    之前的第一套框架在使用过程中发现存在以下问题: 一.  框架1缺点: 1.登陆的账号每个人写的不一样,一旦用户在测试环境被修改,则导致用例失败 2.每次读取访问网址,需要在同一个java文件下切换测试 ...

  3. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  4. 【转】iOS 开发怎么入门?

    原文网址:http://www.zhihu.com/question/20264108 iOS 开发怎么入门? 请问有设计模式.内存管理方面的资料吗?最好有除了官方文档之外的其它内容,10 条评论 分 ...

  5. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  6. iOS端IM开发从入门到填坑

      让App聊起来 IM开发从入门到填坑Demo IM的实现方式 拿来主义,使用第三方IM服务 IM的第三方服务商国内有很多,底层协议基本上都是基于TCP的,类似有网易云信.环信.融云.极光IM.Le ...

  7. 李洪强iOS开发之-入门指南

    李洪强iOS开发之-入门指南 1零基础小白如何进行iOS系统学习 首先,学习目标要明确:其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走:再次,学技术最重 ...

  8. 《IM开发新手入门一篇就够:从零开发移动端IM》

        登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页   即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM   帖子 打赏 分享 发表评论162     想开 ...

  9. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

随机推荐

  1. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...

  2. 001---Linux系统的启动过程

    Linux系统的启动过程 按下电源 开机自检(BIOS):检查cpu.内存.硬盘是否有问题,找到启动盘. MBR引导(master boot record):主引导记录,读取存储设备的512bytes ...

  3. CPU计算密集型和IO密集型

    CPU计算密集型和IO密集型 第一种任务的类型是计算密集型任务,其特点是要进行大量的计算,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以用多 ...

  4. 关于transition动画下,如果有fixed元素,渲染的奇葩问题

    之前我们机票页面有生成一个低价日历,然后我们有一个需求就是滚动到那个月份,对应显示这个月,然后这个区域是fixed定位的,然后奇怪的事情发生了,就是低价日历的动画执行完后,修改页面的html却没有正常 ...

  5. Python3 使用 logging.basicConfig() 配置输出日志中的中文乱码解决办法

    在源码中修改encoding='utf-8',因为 logging.basicConfig() 配置时实际上是用到了4大组件,只不过给了默认值而已,如果不知道怎么找到源码,告诉你们个快捷键,选中你lo ...

  6. Jmeter非GUI命令参数说明

    查看帮助 -h, --help print usage information and exit 查看版本 -v, --version print the version information an ...

  7. zabbix 一些问题随记

    1. zabbix运行不了,显示被锁,去检查日志中的报错 2. 配置界面,连接不到数据库,检查server配置文件,mysql授权命令要准确,重启 3. 显示没有php文件,下载即可,或者修改网页访问 ...

  8. Wordpress 设置后台自定义post 排序

    创建新的 Post type时,文章在后台默认使用 Titile 列进行升序排序,但是通常情况下我们需要按日期 Date 进行降序排序, function wpse_81939_post_types_ ...

  9. [USACO18DEC]Fine Dining

    题面 \(Solution:\) 一开始想的是先跑一遍最短路,然后拆点之后再跑一遍,比较两次dis,然后发现拆点后会有负环(可能是我没想对拆点的方法),于是就放弃了拆点法. 我们考虑强制让每头牛选择走 ...

  10. %matplotlib inline

    整理摘自 https://zhidao.baidu.com/question/1387744870700677180.html %matplotlib inline是jupyter notebook里 ...