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

文章源地址:http://www.cnblogs.com/phinecos/archive/2008/10/20/1315176.html

首先到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
             20 // the length of the packet
               ) != 0 )
    {
        fprintf( stderr,"\nError sending the packet: \n", pcap_geterr( adapterHandle ) );
        return -1;
    }
    system( "PAUSE" );
    return 0;
}

WinCap网络开发库入门(转)相关推荐

  1. LWIP网络开发从入门到精通

    LWIP网络开发从入门到精通 1. LWIP应用开发 | LWIP协议栈 2. LWIP应用开发 | 以太网基础知识 3. LWIP应用开发 | TCP/IP协议簇一 4. LWIP应用开发 | TC ...

  2. 30款Linux 高性能网络开发库开源软件

    转载至:https://blog.csdn.net/lifan_3a/article/details/38410081 Lua的epoll模块 lua-epoll Lua的epoll模块 更多细节,请 ...

  3. 音视频开发5. ZLMediaKit库入门使用 编译安装

    音视频开发5. ZLMediaKit库入门使用 编译安装 一. ZLMediaKit 库简介 二.编译 三.生成物 1. MedisServer 2. SDK (c语言) 3. 测试程序 4. 问题处 ...

  4. 网站的工作原理:网络开发新手(或任何人)入门

    网站的工作原理:网络开发新手(或任何人)入门 如果您刚接触Web开发,您认为自己知道网络的工作原理 - 至少在基本层面上. ...但是,当您尝试解释一个网站为什么出现空白. 什么是IP地址? &quo ...

  5. Symbian开发系列 - 入门篇

    要开始我的Symbian开发之旅了, 先收集一些相关资料,如Symbian概述, 开发平台搭建, 参考书籍与网络资源. [基础] 什么是Symbian 学习Symbian的基本概念  Symbian操 ...

  6. 兼容微信小程序的流式网络请求库

    本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列.如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文.如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于P ...

  7. python项目开发实战网盘-《Python项目案例开发从入门到实战》PDF版百度网盘

    「教程分享:Python项目开发从入门到实列」 本书例子具有实用性,20个不同类型的完整列子,600分钟高品质配套教学视频,完整的源码和教学课件,让你对枯燥的Python语言学习充满乐趣. 编辑推荐 ...

  8. python网络爬虫教程-终于明了python网络爬虫从入门到实践

    Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python网络爬虫从入门到实践 环境配置:下载Pyth ...

  9. [置顶]树莓派Android Things物联网开发:入门及资料汇总

    [转载请注明出处: http://blog.csdn.net/leytton/article/details/77848430] <树莓派Android Things物联网开发>系列文章专 ...

最新文章

  1. 踏向星辰的少年|敢与自己开“杠”,才能和一群人开挂
  2. 数数正方形(ACM/ICPC World Finals)
  3. python面向对象小练习
  4. 讨厌麻烦的ora 01722无效数字
  5. Zend Studio使用教程:序列号注册
  6. Spring4.x(2)--SpringIOC的概念和作用
  7. 个性艺术创意风采人物海报,psd分层模板
  8. cjson 对象是json数组型结构体_C语言cJSON库的使用,解析json数据格式
  9. 记录CodeForces第一次比赛经历
  10. jsf入门实例_JSF selectManyListBox示例教程
  11. 三角网格表面高斯曲率的计算与可视化
  12. matlab画EBSD的极图,EBSD技术原理及系统.PDF
  13. 交通灯—VHDL设计
  14. Spark小文件合并
  15. wireshark使用说明
  16. C++解决一元多次不等式和多元一次不等式
  17. npm cb() never called!和 Error: getaddrinfo ENOTFOUND registry.npmjs.com registry.npmjs.com:443
  18. ACT - 动作游戏
  19. 三维坐标系介绍与转换
  20. 电力电子技术(第一章习题)

热门文章

  1. 科普大佬说 | 如何打造自己的AI创造力?
  2. 西门子smart与施耐德ATV71变频器通讯程序
  3. 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)
  4. 简单实现顺序表示的栈与队列的进栈出栈创空栈入队出队创空队等算法
  5. 强强联合!东南大学-南京信息工程大学共建医学人工智能联合研究院
  6. 【调剂】河北经贸大学2021年硕士研究生调剂公告
  7. RHCSA/Linux基础Day5
  8. Android颜色转换工具类ColorUtil
  9. 斯坦福公开课第6课笔记
  10. warning: redis: unable to open supervise/ok: file does not exist