现在的位置: 首页 > 综合 > 正文

winpcap学习(三)

2018年01月29日 ⁄ 综合 ⁄ 共 1945字 ⁄ 字号 评论关闭

//发送数据包

 bool SendPacket()
    {
        pcap_if_t* allAdapters = NULL; // 适配器列表
        pcap_if_t* pAdapter = NULL;
        pcap_t* adapterHandle = NULL;
        u_char packet[20]; //发送数据包
        char errorBuffer[PCAP_ERRBUF_SIZE+1] = {"0"};
        
        if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&allAdapters,errorBuffer) == -1)
        {
            fprintf(stderr,"non't excute pcap_findalldevs_ex,errorInfo:%s",errorBuffer);
            return -1;
        }
        if(allAdapters == NULL)
        {
            fprintf(stderr," not find the adapter for use!");
            pcap_freealldevs(allAdapters);
            return 0;
        }
        int crtAdapter = 0;
        for(pAdapter = allAdapters; pAdapter;pAdapter = pAdapter->next)
        {
            printf("\nthe interface %d:%s",++crtAdapter,pAdapter->name);
            printf("\n---%s",pAdapter->description);
        }

        // 选择适配器
        int nadapterNum = 0;
        printf(" Enter the number of adapter which you want to send packet!");
        scanf("%d",&nadapterNum);
        // 搜索接口
        if( nadapterNum < 1 || nadapterNum > crtAdapter )
        {
            printf( "\nAdapter number out of range.\n" );
            // 释放适配器列表
            pcap_freealldevs( allAdapters );
            return -1;
        }
        pAdapter = allAdapters;
        for( crtAdapter = 0; crtAdapter < nadapterNum - 1; crtAdapter++ )
            pAdapter = pAdapter->next;
        // 打开指定适配器
        adapterHandle = pcap_open( pAdapter->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", pAdapter->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;
        }
       return 0;

    }

抱歉!评论已关闭.