【问题标题】:How to enumerate network adapters and get their MAC addresses in Win32 API C++?如何在 Win32 API C++ 中枚举网络适配器并获取它们的 MAC 地址?
【发布时间】:2009-11-04 14:03:59
【问题描述】:

如何在 Win32 API C++ 中枚举网络适配器并获取它们的 MAC 地址?

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    这段代码应该可以工作:

    {
        ULONG outBufLen = 0;
        DWORD dwRetVal = 0;
        IP_ADAPTER_INFO* pAdapterInfos = (IP_ADAPTER_INFO*) malloc(sizeof(IP_ADAPTER_INFO));
    
        // retry up to 5 times, to get the adapter infos needed
        for( int i = 0; i < 5 && (dwRetVal == ERROR_BUFFER_OVERFLOW || dwRetVal == NO_ERROR); ++i )
        {
            dwRetVal = GetAdaptersInfo(pAdapterInfos, &outBufLen);
            if( dwRetVal == NO_ERROR )
            {
                break;
            }
            else if( dwRetVal == ERROR_BUFFER_OVERFLOW )
            {
                free(pAdapterInfos);
                pAdapterInfos = (IP_ADAPTER_INFO*) malloc(outBufLen);
            }
            else
            {
                pAdapterInfos = 0;
                break;
            }
        }
        if( dwRetVal == NO_ERROR )
        {
            IP_ADAPTER_INFO* pAdapterInfo = pAdapterInfos;
            while( pAdapterInfo )
            {
                IP_ADDR_STRING* pIpAddress = &(pAdapterInfo->IpAddressList);
                while( pIpAddress != 0 )
                {
                              // 
                              // <<<<
                              // here pAdapterInfo->Address should contain the MAC address
                              // >>>>
                              // 
    
                    pIpAddress = pIpAddress->Next;
                }
                pAdapterInfo = pAdapterInfo->Next;
            }
        }
        free(pAdapterInfos);
        return false;
    }
    

    【讨论】:

    • 为什么使用mallock而不是stack来分配pAdapterInfos?
    • 因为缓冲区大于只有一个结构。循环更新 size 参数。
    • (是的,我知道这个答案已经过时了。)你能解释一下这段代码是如何在散文中工作的,而不是让几个 cmets 解释点点滴滴吗?
    • @NicHartley,其中注释了here 所需的信息应从pAdapterInfo 获取并存储在列表中(这是留给答案读者的练习)
    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2023-04-08
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多