用Winpcap如何获取网卡的MAC和IP?

解决方案 »

  1.   

    用其他方法获取指定网卡的MAC和ip和可以。
      

  2.   

    http://blog.csdn.net/JamesXing/archive/2007/07/24/1704952.aspx
      

  3.   

    Winpcap的手册当中肯定有介绍的,找找
      

  4.   

    //获取网卡参数程序,前提是要安装winpcap及将头文件与lib文件复制到相关文件夹下
    #include "pcap.h" 
    #pragma comment(lib, "wpcap.lib")main() 

      pcap_if_t *alldevs; 
      pcap_if_t *d; 
      int i=0; 
      char errbuf[PCAP_ERRBUF_SIZE]; 
       
      /* 这个API用来获得网卡 的列表 */ 
      if (pcap_findalldevs(&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; 
      }   /* We don’t need any more the device list. Free it */ 
      pcap_freealldevs(alldevs); 

    //获取IP参数程序
    #include "pcap.h" 
    #pragma comment(lib, "wpcap.lib")
    void ifprint(pcap_if_t *d); 
    char *iptos(u_long in); int main() 

    pcap_if_t *alldevs; 
    pcap_if_t *d; 
    char errbuf[PCAP_ERRBUF_SIZE+1]; /* 获得设备列表 */ 
    if (pcap_findalldevs(&alldevs, errbuf) == -1) 

    fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf); 
    exit(1); 
    } /* 遍历所有元素 */ 
    for(d=alldevs;d;d=d->next) 

    ifprint(d); 
    } return 1; 
    } /* Print all the available information on the given interface */ 
    void ifprint(pcap_if_t *d) 

    pcap_addr_t *a; /* 名称 */ 
    printf("%s\n",d->name); /* 描述 */ 
    if (d->description) 
    printf("\tDescription: %s\n",d->description); /* 回环地址 */ 
    printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no"); /* IP 地址 */ 
    for(a=d->addresses;a;a=a->next) { 
    printf("\tAddress Family: #%d\n",a->addr->sa_family); switch(a->addr->sa_family) 

    case AF_INET: 
    printf("\tAddress Family Name: AF_INET\n"); 
    if (a->addr) 
    /* Y- IP 地址 */ 
    printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr)); 
    if (a->netmask) 
    /* Y- 掩码 */ 
    printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr)); 
    if (a->broadaddr) 
    /* Y- 广播地址 */ 
    printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr)); 
    if (a->dstaddr) 
    /* Y - 目标地址 */ 
    printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr)); 
    break; 
    default: 
    /* 未知 */ 
    printf("\tAddress Family Name: Unknown\n"); 
    break; 


    printf("\n"); 
    } /* 来自 tcptracert, 把数字IP地址转换为点格式 */ 
    #define IPTOSBUFFERS 12 
    char *iptos(u_long in) 

    static char output[IPTOSBUFFERS][3*4+3+1]; 
    static short which; 
    u_char *p; p = (u_char *)∈ 
    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1); 
    sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); 
    return output[which]; 

      

  5.   

    我个人觉得winpcap这块不是很稳定,我比较喜欢用IP Help API获得http://topic.csdn.net/u/20080215/15/b24bf5e3-1d59-4597-ad8f-511926531a1c.html