栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 获取本地网卡信息

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 获取本地网卡信息

// GetNetworkCardInformation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。






 





// GetNetworkCardInformation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。






 





#include 

#include 

#include 

#include 

#include 

#pragma comment(lib,"Iphlpapi.lib")


/// @brief 拆功能键结构体, 获取信息
void GetNetworkCard();

void NetworkCardInformation(PIP_ADAPTER_INFO pIpAdapterInfo);

int getMac();

int main()
{
   //两个都可以使用
   GetNetworkCard();
  // getMac();
    return 0;
}



int getMac() {
    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0;
    UINT i;

    
    struct tm newtime;
    char buffer[32];
    errno_t error;

    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfon");
        return 1;
    }
    // Make an initial call to GetAdaptersInfo to get
    // the necessary size into the ulOutBufLen variable
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        free(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            printf("Error allocating memory needed to call GetAdaptersinfon");
            return 1;
        }
    }

    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
        pAdapter = pAdapterInfo;
        while (pAdapter) {
            std::cout << "------------------------" << std::endl;
            printf("tComboIndex: t5dn", pAdapter->ComboIndex);
            printf("tAdapter Name: t%sn", pAdapter->AdapterName);
            printf("tAdapter Desc: t%sn", pAdapter->Description);
            printf("tAdapter Addr: t");
            for (i = 0; i < pAdapter->AddressLength; i++) {
                if (i == (pAdapter->AddressLength - 1))
                    printf("%.2Xn", (int)pAdapter->Address[i]);
                else
                    printf("%.2X-", (int)pAdapter->Address[i]);
            }
            printf("tIndex: t%dn", pAdapter->Index);
            printf("tType: t");
            switch (pAdapter->Type) {
            case MIB_IF_TYPE_OTHER:
                printf("Othern");
                break;
            case MIB_IF_TYPE_ETHERNET:
                printf("Ethernetn");
                break;
            case MIB_IF_TYPE_TOKENRING:
                printf("Token Ringn");
                break;
            case MIB_IF_TYPE_FDDI:
                printf("FDDIn");
                break;
            case MIB_IF_TYPE_PPP:
                printf("PPPn");
                break;
            case MIB_IF_TYPE_LOOPBACK:
                printf("Lookbackn");
                break;
            case MIB_IF_TYPE_SLIP:
                printf("Slipn");
                break;
            default:
                printf("Unknown type %ldn", pAdapter->Type);
                break;
            }

            printf("tIP Address: t%sn",
                pAdapter->IpAddressList.IpAddress.String);
            printf("tIP Mask: t%sn", pAdapter->IpAddressList.IpMask.String);

            printf("tGateway: t%sn", pAdapter->GatewayList.IpAddress.String);
            printf("t***n");

            if (pAdapter->DhcpEnabled) {
                printf("tDHCP Enabled: Yesn");
                printf("t  DHCP Server: t%sn",
                    pAdapter->DhcpServer.IpAddress.String);

                printf("t  Lease Obtained: ");
                
                error = _localtime32_s(&newtime, (const __time32_t* )&pAdapter->LeaseObtained);
                if (error)
                    printf("Invalid Argument to _localtime32_sn");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_sn");
                    else
                        
                        printf("%s", buffer);
                }

                printf("t  Lease Expires:  ");
                error = _localtime32_s(&newtime, (const __time32_t*)&pAdapter->LeaseExpires);
                if (error)
                    printf("Invalid Argument to _localtime32_sn");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_sn");
                    else
                        
                        printf("%s", buffer);
                }
            }
            else
                printf("tDHCP Enabled: Non");

            if (pAdapter->HaveWins) {
                printf("tHave Wins: Yesn");
                printf("t  Primary Wins Server:    %sn",
                    pAdapter->PrimaryWinsServer.IpAddress.String);
                printf("t  Secondary Wins Server:  %sn",
                    pAdapter->SecondaryWinsServer.IpAddress.String);
            }
            else
                printf("tHave Wins: Non");
            pAdapter = pAdapter->Next;
            std::cout << "------------------------" << std::endl;
            printf("n");
        }
    }
    else {
        printf("GetAdaptersInfo failed with error: %dn", dwRetVal);

    }
    if (pAdapterInfo)
        free(pAdapterInfo);

    return 0;

}

/// @brief 拆功能键结构体, 获取信息
void GetNetworkCard() {
    //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
    PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();

    //得到结构体大小,用于GetAdaptersInfo参数
    unsigned long stSize = sizeof(IP_ADAPTER_INFO);

    //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
    int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);

    if (ERROR_BUFFER_OVERFLOW == nRel)
    {
        //如果函数返回的是ERROR_BUFFER_OVERFLOW
           //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
       //这也是说明为什么stSize既是一个输入量也是一个输出量
       //释放原来的内存空间
        delete pIpAdapterInfo;

        //重新申请内存空间用来存储所有网卡信息
        pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];

        //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
        nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);

    }
    if (ERROR_SUCCESS == nRel)
    {
        //输出网卡信息
        NetworkCardInformation(pIpAdapterInfo);
    }
    //释放内存空间
    if (pIpAdapterInfo)
    {
        delete pIpAdapterInfo;
    }
}






///函数作用,输出网卡信息
void NetworkCardInformation(PIP_ADAPTER_INFO pIpAdapterInfo)
{
    //可能有多网卡,因此通过循环去判断
    while (pIpAdapterInfo)
    {
        int i;
        std::cout << "网卡名称:" << pIpAdapterInfo->AdapterName << std::endl;
        std::cout << "网卡描述:" << pIpAdapterInfo->Description << std::endl;
        std::cout << "网卡MAC地址:";// << (unsigned char*)pIpAdapterInfo->Address << std::endl;
        for (i = 0; i < pIpAdapterInfo->AddressLength; i++) {
            if (i == (pIpAdapterInfo->AddressLength - 1))
                printf("%.2Xn", (int)pIpAdapterInfo->Address[i]);
            else
                printf("%.2X-", (int)pIpAdapterInfo->Address[i]);
        }
        std::cout << "默认网关:"    << pIpAdapterInfo->GatewayList.IpAddress.String << std::endl;
        for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
            if (i == pIpAdapterInfo->AddressLength - 1)
            {
                printf("%02xn", pIpAdapterInfo->Address[i]);
            }
            else
            {
                printf("%02x-", pIpAdapterInfo->Address[i]);
            }
        std::cout << "网卡IP地址如下:" << std::endl;
        //可能网卡有多IP,因此通过循环去判断
        IP_ADDR_STRING* pIpAddrString = &(pIpAdapterInfo->IpAddressList);
        do
        {
            std::cout << pIpAddrString->IpAddress.String << std::endl;
            pIpAddrString = pIpAddrString->Next;
        } while (pIpAddrString);
        pIpAdapterInfo = pIpAdapterInfo->Next;
        std::cout << "*****************************************************" << std::endl;
    }
    return;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号