我知道如何用NetBEUI得到局域网地址,但我没有这个协议,在这种情况下,我如何能得到本机MAC地址
 谢谢!

解决方案 »

  1.   

    可以参考下面这篇文章
    http://hi.baidu.com/baibaiwei/blog/item/2712a8012e1348021d9583cf.html
      

  2.   

    这里给你一个例子
    http://download.csdn.net/source/2681512
      

  3.   

    本帖最后由 VisualEleven 于 2010-11-16 11:46:33 编辑
      

  4.   

    通过GetAdaptersInfo获取网卡MAC
      

  5.   

    #include <winsock2.h>
    #include <iphlpapi.h>
    #include <stdlib.h>#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
    #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
    /* Note: could also use malloc() and free() */int __cdecl main(int argc, char **argv)
    {    /* Declare and initialize variables */    DWORD dwSize = 0;
        DWORD dwRetVal = 0;    int i = 0;    // Set the flags to pass to GetAdaptersAddresses
        ULONG flags = GAA_FLAG_INCLUDE_PREFIX;    // default to unspecified address family (both)
        ULONG family = AF_UNSPEC;    LPVOID lpMsgBuf = NULL;    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
        ULONG outBufLen = 0;    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
        PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
        PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
        PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
        IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
        IP_ADAPTER_PREFIX *pPrefix = NULL;    if (argc != 2) {
            printf(" Usage: getadapteraddresses family\n");
            printf("        getadapteraddresses 4 (for IPv4)\n");
            printf("        getadapteraddresses 6 (for IPv6)\n");
            printf("        getadapteraddresses A (for both IPv4 and IPv6)\n");
            exit(1);
        }    if (atoi(argv[1]) == 4)
            family = AF_INET;
        else if (atoi(argv[1]) == 6)
            family = AF_INET6;    outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
        pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);    // Make an initial call to GetAdaptersAddresses to get the 
        // size needed into the outBufLen variable
        if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen)
            == ERROR_BUFFER_OVERFLOW) {
            FREE(pAddresses);
            pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
        }    if (pAddresses == NULL) {
            printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
            exit(1);
        }
        // Make a second call to GetAdapters Addresses to get the
        // actual data we want
        printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen);
        printf("Calling GetAdaptersAddresses function with family = ");
        if (family == AF_INET)
            printf("AF_INET\n");
        if (family == AF_INET6)
            printf("AF_INET6\n");
        if (family == AF_UNSPEC)
            printf("AF_UNSPEC\n\n");    dwRetVal =
            GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);    if (dwRetVal == NO_ERROR) {
            // If successful, output some information from the data we received
            pCurrAddresses = pAddresses;
            while (pCurrAddresses) {
                printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
                       pCurrAddresses->Length);
                printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
                printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);            pUnicast = pCurrAddresses->FirstUnicastAddress;
                if (pUnicast != NULL) {
                    for (i = 0; pUnicast != NULL; i++)
                        pUnicast = pUnicast->Next;
                    printf("\tNumber of Unicast Addresses: %d\n", i);
                } else
                    printf("\tNo Unicast Addresses\n");            pAnycast = pCurrAddresses->FirstAnycastAddress;
                if (pAnycast) {
                    for (i = 0; pUnicast != NULL; i++)
                        pAnycast = pAnycast->Next;
                    printf("\tNumber of Anycast Addresses: %d\n", i);
                } else
                    printf("\tNo Anycast Addresses\n");            pMulticast = pCurrAddresses->FirstMulticastAddress;
                if (pMulticast) {
                    for (i = 0; pMulticast != NULL; i++)
                        pMulticast = pMulticast->Next;
                    printf("\tNumber of Multicast Addresses: %d\n", i);
                } else
                    printf("\tNo Multicast Addresses\n");            pDnServer = pCurrAddresses->FirstDnsServerAddress;
                if (pDnServer) {
                    for (i = 0; pDnServer != NULL; i++)
                        pDnServer = pDnServer->Next;
                    printf("\tNumber of DNS Server Addresses: %d\n", i);
                } else
                    printf("\tNo DNS Server Addresses\n");            printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
                printf("\tDescription: %wS\n", pCurrAddresses->Description);
                printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName);            if (pCurrAddresses->PhysicalAddressLength != 0) {
                    printf("\tPhysical address: ");
                    for (i = 0; i < (int) pCurrAddresses->PhysicalAddressLength;
                         i++) {
                        if (i == (pCurrAddresses->PhysicalAddressLength - 1))
                            printf("%.2X\n",
                                   (int) pCurrAddresses->PhysicalAddress[i]);
                        else
                            printf("%.2X-",
                                   (int) pCurrAddresses->PhysicalAddress[i]);
                    }
                }
                printf("\tFlags: %ld\n", pCurrAddresses->Flags);
                printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
                printf("\tIfType: %ld\n", pCurrAddresses->IfType);
                printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
                printf("\tIpv6IfIndex (IPv6 interface): %u\n",
                       pCurrAddresses->Ipv6IfIndex);
                printf("\tZoneIndices (hex): ");
                for (i = 0; i < 16; i++)
                    printf("%lx ", pCurrAddresses->ZoneIndices[i]);
                printf("\n");            pPrefix = pCurrAddresses->FirstPrefix;
                if (pPrefix) {
                    for (i = 0; pPrefix != NULL; i++)
                        pPrefix = pPrefix->Next;
                    printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
                } else
                    printf("\tNo IP Adapter Prefix entries\n");            printf("\n");            pCurrAddresses = pCurrAddresses->Next;
            }
        } else {
            printf("Call to GetAdaptersAddresses failed with error: %d\n",
                   dwRetVal);
            if (dwRetVal == ERROR_NO_DATA)
                printf("\tNo addresses were found for the requested parameters\n");
            else {            if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),   // Default language
                                  (LPTSTR) & lpMsgBuf, 0, NULL)) {
                    printf("\tError: %s", lpMsgBuf);
                    LocalFree(lpMsgBuf);
                    FREE(pAddresses);
                    exit(1);
                }
            }
        }
        FREE(pAddresses);
        return 0;
    }
      

  6.   

    NCB Ncb  ,ncb1; 
        UCHAR uRetCode ,retCode; 
    LANA_ENUM lenum; 
    int i = 0; 
    typedef struct _ASTAT_
    {
            ADAPTER_STATUS adapt;
            NAME_BUFFER    NameBuff [30];
    }ASTAT, * PASTAT;
    ASTAT Adapter;
    memset(&Ncb, 0, sizeof(Ncb)); 
    Ncb.ncb_command = NCBENUM; 
    Ncb.ncb_buffer = (UCHAR *)&lenum; 
    Ncb.ncb_length = sizeof(lenum); 
    Netbios(&Ncb);
    for(i=0; i < lenum.length ;i++)
    {
            memset( &ncb1, 0, sizeof(ncb1) );
    ncb1.ncb_command = NCBRESET;
            ncb1.ncb_lana_num = lenum.lana[i];   // 指定网卡号
    retCode = Netbios( &ncb1 );
    memset( &ncb1, 0, sizeof(ncb1) );
            ncb1.ncb_command = NCBASTAT;
            ncb1.ncb_lana_num = lenum.lana[i];  // 指定网卡号         strcpy( (char *)ncb1.ncb_callname,"*" );
        // 指定返回的信息存放的变量 
            ncb1.ncb_buffer = (unsigned char *) &Adapter;
        ncb1.ncb_length = sizeof(Adapter);     // 发送NCBASTAT命令以获取网卡的信息 
        retCode = Netbios( &ncb1 );
    if ( retCode == 0 )

                CString strMacAddr;
    strMacAddr.Format( "%02X%02X%02X%02X%02X%02X",
    Adapter.adapt.adapter_address[0],
    Adapter.adapt.adapter_address[1],
    Adapter.adapt.adapter_address[2],
    Adapter.adapt.adapter_address[3],
    Adapter.adapt.adapter_address[4],
    Adapter.adapt.adapter_address[5] );
    return strMacAddr;
    }
    }
        return "";
      

  7.   

    你的机器中可能不止一个网卡信息BYTE AdapterMAC[8]; //保存网卡mac地址
    IP_ADAPTER_INFO pAdapterInfo[10]; //IP_ADAPTER_INFO为网卡信息结构体,其中AdapterName表示网卡名,Address(BYTE[8])表示MAC地址,IpAddressList.IpAddress表示ip地址
    DWORD dwBufLen = sizeof(IP_ADAPTER_INFO)*10;  
    DWORD dwStatus = GetAdaptersInfo(      
    pAdapterInfo,                 // [output] 指向接收数据缓冲指针
    &dwBufLen);// [input] 缓冲区大小
    assert(dwStatus== ERROR_SUCCESS); PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0; pAdapter = pAdapterInfo;
    while (pAdapter) 
                    {
    memcpy(AdapterMAC,pAdapter->Address,sizeof(pAdapter->Address));
    return ;
    }
    pAdapter = pAdapter->Next;
    }
    return ;
      

  8.   

    //获得指定网卡序号的Mac地址
    void CGetMacAddrDlg::GetOneMac(int AdapterIndex)
    {
        NCB ncb;
        UCHAR uRetCode;
    ASTAT Adapter;
        memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBRESET;
        ncb.ncb_lana_num = AdapterIndex;   // 指定网卡号

    //首先对选定的网卡发送一个NCBRESET命令,以便进行初始化 
    uRetCode = Netbios( &ncb );    memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBASTAT;
        ncb.ncb_lana_num = AdapterIndex;  // 指定网卡号    strcpy( (char *)ncb.ncb_callname,"*" );
    // 指定返回的信息存放的变量 
        ncb.ncb_buffer = (unsigned char *) &Adapter;
    ncb.ncb_length = sizeof(Adapter); // 发送NCBASTAT命令以获取网卡的信息 
    uRetCode = Netbios( &ncb );
        if ( uRetCode == 0 )
        {
    // 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802 
    CString strMacAddr;
    strMacAddr.Format( "%02X%02X-%02X%02X-%02X%02X\n",
    Adapter.adapt.adapter_address[0],
    Adapter.adapt.adapter_address[1],
    Adapter.adapt.adapter_address[2],
    Adapter.adapt.adapter_address[3],
    Adapter.adapt.adapter_address[4],
    Adapter.adapt.adapter_address[5] ); //将网卡地址和序号存入数组中
    ADPTSTRCT AdptSt;
    AdptSt.nIndex = AdapterIndex;
    AdptSt.strMac = strMacAddr;
    m_arrAdapters.Add(AdptSt);
        }
    }