用NetBIOS方法得到的网卡地址怎么乱七八糟,我想程序每次运行只返回唯一的一个稳定的MAC地址,该怎么做?枚举部分程序如下:
LANA_ENUM AdapterList;
    NCB Ncb;
    memset(&Ncb, 0, sizeof(NCB));
    Ncb.ncb_command = NCBENUM;
    Ncb.ncb_buffer = (unsigned char *)&AdapterList;
    Ncb.ncb_length = sizeof(AdapterList);
    Netbios(&Ncb);
  AdapterList.length会有一堆,我该选哪一个才能保证每次返回都是唯一一个有效的mac地址呢?
    程序的所有返回如下:
MAC Address: 80-F9-20-52-41-53
MAC Address: 80-F9-20-52-41-53
MAC Address: 80-F9-20-52-41-53
MAC Address: 80-F9-20-52-41-53
MAC Address: 80-F9-20-52-41-53
MAC Address: 00-00-00-00-00-00
MAC Address: 00-50-FC-09-D8-5B
    重复一堆,还有假的。要求95/98/me/nt/2000 /xp都可以?

解决方案 »

  1.   

    //why not search source code "ipconfig"in Linux,such as this
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>int get_mac_ip( ip, mac )
        int *ip;
        int *mac;
    {
        char *tfn, *cmd, *ipc = "ipconfig /all ";
        int ret = 0;
        FILE *tf;
        char buf[128];    if ( (tfn = _tempnam(0, "ipconfig")) == (char *)0 )
    ret = -1;    if ( ret == 0 && (cmd = (char *)malloc(strlen(tfn) + strlen(ipc) +
    4)) ==
     (char *)0 )
    ret = -1;    (void)sprintf( cmd, "%s > %s", ipc, tfn );    if ( ret == 0 && (ret = system(cmd)) < 0 )
        {
    fprintf( stderr, "command \"%s\" failed with error <%s>\n",
     cmd, strerror(errno) );
        }    if ( ret == 0 && (tf = fopen(tfn, "r")) == (FILE *)0 )
        {
    fprintf( stderr, "failed with error <%s>\n",
     cmd, strerror(errno) );
        }
        
        while ( ret == 0 && fgets(buf, sizeof(buf), tf) != (char *)0 )
        {
    if ( strstr(buf, "Physical Address") )
    {
        if ( sscanf(strchr(buf,':')+2, "%02x-%02x-%02x-%02x-%02x-%02x",
    &mac[0],
    &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) < 6 )
        {
    fprintf( stderr, "error in Physical Address line <%s>\n", buf );
    ret = -1;
        }
    }
    else if ( strstr(buf, "IP Address") )
    {
        if ( sscanf(strchr(buf,':')+2, "%u.%u.%x.%u", &ip[0], &ip[1],
    &ip[2], &ip[3]) < 4 )
        {
    fprintf( stderr, "error in IP Address line <%s>\n", buf );
    ret = -1;
        }
    }
        }    if ( tf ) fclose( tf );
        if ( cmd ) free( cmd );
        if ( tfn ) free( tfn );    return ret;
    }main()
    {
        int ip[4], mac[6];    (void)get_mac_ip( ip, mac ); /* MUST USE %02X to keep first 0! */
        printf( "MAC address: %02X-%02X-%02X-%02X-%02X-%02X\n", mac[0],
    mac[1], mac[2],
        mac[3], mac[4], mac[5] );
        printf("%d %d %d %d %d %d\n",mac[0], mac[1], mac[2], mac[3],
    mac[4], mac[5] );
        printf( "IP address: %u.%u.%x.%u\n", ip[0], ip[1], ip[2], ip[3] );
    }
      

  2.   

    DWORD SendARP(
    IPAddr DestIP,// destination IP address
    IPAddr SrcIP, // IP address of sender
    PULONG pMacAddr, // returned physical address
    PULONG PhyAddrLen // length of returned physical addr.);
      

  3.   

    多谢 kingzai() 
         ZHENG017(风中王子)你们的程序能跨平台吗,稳定吗
      

  4.   

    你直接运行IpConfig/all就能看到MAC地址,我程序实现的就这个功能.
      

  5.   

    你要怎样更通用?Q118623 HOWTO: Get the MAC Address for an Ethernet Adapter
    是MSDN的做法,而键入ipConfig/all则是非常通用的查看命令。