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

    xiaoxiao2021-08-20  84

    源码

    源码一

    #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%6; 

        } 

     

        /* 发送数据包*/ 

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

        { 

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

            return

        } 

     

        return

    }  

    转载请注明原文地址: https://ju.6miu.com/read-676746.html

    最新回复(0)