winpcap三个源码实例,可直接使用

源码

源码一

#include "pcap.h"

#define HAVE_REMOTE

#include "remote-ext.h"

#pragma comment(lib,"wpcap.lib")

int main()

{

    pcap_if_t *alldevs; //pcap_if_t is interface type

    pcap_if_t *d;

    charerrbuf[PCAP_ERRBUF_SIZE];  // store error information

    inti;

    //struct pcap_rmtauth Ubuntu_cat;

    charsource[PCAP_BUF_SIZE];

    if(pcap_createsrcstr(source, PCAP_SRC_FILE,

        NULL, NULL,

        "本地连接",

        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 forlocal host

                           NULL, // auth to remote host. NULL if localhost

                           &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);

    return0;

}

源码二

#define HAVE_REMOTE 

#include "pcap.h" 

void gen_packet(unsignedchar*buf,int len); 

#pragma comment(lib,"wpcap.lib")

/*生成数据包*/ 

void gen_packet(unsignedchar*buf,intlen

    inti=0; 

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

    for(i=0;i<6;i++) 

    { 

        buf[i]=0x01; 

    } 

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

    for(i=6;i<12;i++) 

    { 

        buf[i]=0x02; 

    } 

    //设置协议标识为0xc0xd,无任何实际意义 

    buf[12]=0xc; 

    buf[13]=0xd; 

    //填充数据包的内容 

    for(i=14;i<len;i++) 

    { 

        buf[i]=i-14; 

    } 

 

 

int main() 

    pcap_if_t *alldevs; 

    pcap_if_t *d; 

    intinum; 

    inti=0; 

    pcap_t *adhandle; 

    charerrbuf[PCAP_ERRBUF_SIZE]; 

    intret=-1; 

    /*获取本机网络设备列表 */ 

    if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) 

    { 

        fprintf(stderr,"Error in pcap_findalldevs:%s\n", errbuf); 

        exit(1); 

    } 

    /*打印网络设备列表 */ 

    for(d=alldevs;d; d=d->next) 

    { 

        printf("%d. %s", ++i, d->name); 

        if(d->description) 

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

        else 

            printf(" (No description available)\n"); 

    } 

    if(i==0) 

    { 

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

        return-1; 

    } 

    /*选择网络设备接口*/ 

    printf("Enter the interface number (1-%d):",i); 

    scanf("%d", &inum); 

    if(inum< 1 || inum > i) 

    { 

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

        /*释放设备列表 */ 

        pcap_freealldevs(alldevs); 

        return-1; 

    } 

    /*跳转到选中的适配器 */ 

    for(d=alldevs,i=0; i< inum-1 ;d=d->next, i++); 

    /*打开设备 */ 

    if( (adhandle= pcap_open(d->name,         // 设备名 

        65536,            // 65535保证能捕获到数据链路层上每个数据包的全部内容 

        PCAP_OPENFLAG_PROMISCUOUS,   // 混杂模式 

        1000,             // 读取超时时间 

        NULL,             //远程机器验证 

        errbuf            // 错误缓冲池 

        ) ) ==NULL

    { 

        fprintf(stderr,"\nUnable to open the adapter.%s is not supported by WinPcap\n", d->name); 

        /*释放设备列表 */ 

        pcap_freealldevs(alldevs); 

        return-1; 

    } 

    /*在选中的设备接口上发送数据*/ 

    printf("\nsending on %s...\n", d->description); 

    /*发送数据包*/ 

    //生成数据报 

    intpacketlen=100; 

    unsignedchar*buf= (unsigned char*)malloc(packetlen); 

    memset(buf,0x0,packetlen); 

    gen_packet(buf,packetlen);//获得生成的数据包,长度为packetlen 

    //开始数据包发送 

    if( (ret=pcap_sendpacket(adhandle,buf,packetlen))==-1) 

    { 

        printf("发送失败\n"); 

        free(buf); 

        pcap_close(adhandle); 

        pcap_freealldevs(alldevs); 

        return-1; 

    } 

    /*释放资源*/ 

    free(buf); 

    pcap_close(adhandle); 

    pcap_freealldevs(alldevs); 

 

    return0; 

获取设备地址程序源码三

#define HAVE_REMOTE 

#include "pcap.h" 

void gen_packet(unsigned char *buf,int len); 

#pragma comment(lib, "wpcap.lib")

int main(){   

    pcap_if_t  * alldevs;       //所有网络适配器 

    pcap_if_t  *d;                  //选中的网络适配器 

    charerrbuf[PCAP_ERRBUF_SIZE];  //错误缓冲区,大小为256 

    inti = 0;                            //适配器计数变量 

    /**

        int pcap_findalldevs_ex  ( char * source,  

                                                     struct pcap_rmtauth *  auth,  

                                                     pcap_if_t **  alldevs,  

                                                     char *  errbuf  );

        PCAP_SRC_IF_STRING代表用户想从一个本地文件开始捕获内容;

    */ 

    //获取本地适配器列表 

    if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf) == -1){ 

        //结果为-1代表出现获取适配器列表失败 

        fprintf(stderr,"Error inpcap_findalldevs_ex:\n",errbuf); 

        //exit(0)代表正常退出,exit(other)为非正常退出,这个值会传给操作系统 

        exit(1); 

    } 

    //打印设备列表信息 

    /**

        d = alldevs 代表赋值第一个设备,d = d->next代表切换到下一个设备

        结构体 pcap_if_t:

        pcap_if *  next                 指向下一个pcap_if,pcap_if_tpcap_if 结构是一样的

        char * name                        代表适配器的名字

        char * description         对适配器的描述

        pcap_addr *  addresses 适配器存储的地址

        u_int flags                            适配器接口标识符,值为PCAP_IF_LOOPBACK

    */ 

    for(d= alldevs;d !=NULL;d =d->next){ 

        printf("number:%d name:%s",++i,d->name); 

        if(d->description){ 

            //打印适配器的描述信息 

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

        }else

            //适配器不存在描述信息 

            printf("description:%s","no description\n"); 

        } 

        printf("flags:%s\n",d->flags); 

    } 

    //i0代表上述循环未进入,即没有找到适配器,可能的原因为Winpcap没有安装导致未扫描到 

    if(i== 0){ 

        printf("interface not found,pleasecheck winpcap installation"); 

    } 

    //释放网络适配器列表 

    pcap_freealldevs(alldevs);   

    return0;   

发送包

#define HAVE_REMOTE 

#include "pcap.h" 

void gen_packet(unsigned char *buf,int len); 

#pragma comment(lib, "wpcap.lib")

 

void main(int argc, char **argv

    pcap_t*fp; 

    charerrbuf[PCAP_ERRBUF_SIZE]; 

    u_charpacket[100]; 

    inti; 

 

    /* 检查命令行参数的合法性*/ 

    if(argc != 2) 

    { 

        printf("usage: %s interface (e.g.'rpcap://eth0')",argv[0]); 

        return

    } 

 

    /* 打开输出设备*/ 

    if( (fp= pcap_open(argv[1],            // 设备名 

        100,                // 要捕获的部分 (只捕获前100个字节

        PCAP_OPENFLAG_PROMISCUOUS// 混杂模式 

        1000,               // 读超时时间 

        NULL,               // 远程机器验证 

        errbuf              // 错误缓冲 

        ) ) == NULL

    { 

        fprintf(stderr,"\nUnable to open the adapter.%s is not supported by WinPcap\n", argv[1]); 

        return

    } 

 

    /* 假设在以太网上,设置MAC的目的地址为 1:1:1:1:1:1 */ 

    packet[0]=1; 

    packet[1]=1; 

    packet[2]=1; 

    packet[3]=1; 

    packet[4]=1; 

    packet[5]=1; 

 

    /* 设置MAC源地址为 2:2:2:2:2:2 */ 

    packet[6]=2; 

    packet[7]=2; 

    packet[8]=2; 

    packet[9]=2; 

    packet[10]=2; 

    packet[11]=2; 

 

    /* 填充剩下的内容*/ 

    for(i=12;i<100;i++) 

    { 

        packet[i]=i%256; 

    } 

 

    /* 发送数据包*/ 

    if(pcap_sendpacket(fp, packet, 100 /*size */) !=0) 

    { 

        fprintf(stderr,"\nError sending the packet:\n",pcap_geterr(fp)); 

        return

    } 

 

    return

}  

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页