WINDOWS下WINPCAP获取网卡列表及网卡信息

WINDOWS下WINPCAP获取网卡列表及网卡信息

因工作需要需要发送使用原始套接字发送MAC包完成,WINDOWS的套接字好像只能支持到IP层不能到MAC层,所以找到了winpcap来完成MAC包的发送和接收

获取网卡列表

pcap_if_t *alldev;
char errbuf[PCAP_ERRBUF_SIZE];
    if (pcap_findalldevs(&alldev,errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
        exit(1);
    }
        for(d=*alldev;d;d=d->next){
        printf("addr: %s \n",d->name);
        printf("%d. %s\n    ", ++num, d->name);
        printf("d->addresses->addr->sa_family = %hd\n",d->addresses->addr->sa_family);
        pcap_lookupnet(d->name,&net_ip,&net_mask,errbuf);
        net_ip_address.s_addr = net_ip;
         printf("%d.%d.%d.%d\n",(net_ip>>24)&0x00ff,(net_ip>>16)&0x00ff,      (net_ip>>8)&0x00ff,(net_ip)&0x00ff);
        net_ip_string = inet_ntoa(net_ip_address);//format
        printf("网络地址: %s \n",net_ip_string);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (No description available)\n");
    }

获取网卡列表,本以为可以获取到IP信息,但是alldev中却是空的,并没有IP信息,只有网卡的名称和描述,pcap_lookupnet函数获取IP和掩码,只得到了网段信息,并没有IP的信息

获取网卡的IP和掩码

pcap_if_t *d = alldev;
lpAdapter =   PacketOpenAdapter(d->name);//打开一个网络设备名
npf_if_addr buffer[4];
long a=4;
PLONG NEntries=&a;
PacketGetNetInfoEx(d->name, buffer,  NEntries);//获取网卡的IP和掩码
//打印网卡的IP地址系列和IP
printf("buffer.IPAddress.ss_family=%d\n",buffer[0].IPAddress.ss_family);
net_ip_string=inet_ntoa(((sockaddr_in*)&buffer[0].IPAddress)->sin_addr);
printf("((sockaddr_in*)&buffer.IPAddress)->sin_addr=%s\n",net_ip_string);
OidData =(PPACKET_OID_DATA) malloc(6 + sizeof(PPACKET_OID_DATA));

打开网络设备,获取网卡的IP和掩码需要转换一下结构体类型,正确打印出IP信息

获取网卡的MAC地址

//获取网卡的MAC地址并打印
OidData->Oid = OID_802_3_PERMANENT_ADDRESS;
OidData->Length = 6;
ZeroMemory(OidData->Data, 6);
Status = PacketRequest(lpAdapter, FALSE, OidData);
printf("The MAC address of the adapter is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
       (unsigned char)(OidData->Data)[0],
       (unsigned char)(OidData->Data)[1],
       (unsigned char)(OidData->Data)[2],
       (unsigned char)(OidData->Data)[3],
       (unsigned char)(OidData->Data)[4],
       (unsigned char)(OidData->Data)[5]);
PacketCloseAdapter(lpAdapter);//关闭设备

获取IP信息和MAC完成

你可能感兴趣的:(winpcap获取IP和MAC)