• 获取当前电脑全部网络连接名字


    原文链接地址:https://www.cnblogs.com/gccbuaa/p/6708774.html

    近期由于项目有须要获取本机的全部存在的网络连接名称,在网上也找了资料,有好几种方法,只是就仅仅有一种是可以达到我想要的要求

    写下来给大家參考下

    第一种方法:遍历注冊表来获取

     1 void __fastcall MyGetLanAdapterName(char *szLanAdapterName)
     2 {
     3     HKEY hKey, hSubKey, hNdiIntKey;
     4     if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
     5         "System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}",
     6         0,
     7         KEY_READ,
     8         &hKey) != ERROR_SUCCESS)
     9         return;
    10 
    11     DWORD dwIndex = 0;
    12     DWORD dwBufSize = 256;
    13     DWORD dwDataType;
    14     char szSubKey[256];
    15     unsigned char szData[256];
    16 
    17     while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
    18     {
    19         if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
    20         {
    21             if(RegOpenKeyEx(hSubKey, "Ndi\Interfaces", 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)
    22             {
    23                 dwBufSize = 256;
    24                 if(RegQueryValueEx(hNdiIntKey, "LowerRange", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
    25                 {
    26                     if(strcmp((char*)szData, "ethernet") == 0) // 推断是不是以太网卡
    27                     {
    28                         dwBufSize = 256;
    29                         if(RegQueryValueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
    30                         {
    31                             // szData 中便是适配器具体描写叙述
    32                             dwBufSize = 256;
    33                             if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
    34                             {
    35                                 //szData中便是适配器名称
    36                                 strcpy(szLanAdapterName, (char *)szData);
    37                             }
    38                         }
    39                     }
    40                 }
    41                 RegCloseKey(hNdiIntKey);
    42             }
    43             RegCloseKey(hSubKey);
    44         }
    45         dwBufSize = 256;
    46     } /* end of while */
    47     RegCloseKey(hKey);
    48 }

    szLanAdapterName即为网络连接的名称 如{C6DFC923-0895-4FCE-85F2-740E6133EC6D}

    另外一种方法是通过API:

     1 void __fastcall GetLanAdapterName()
     2 {
     3     ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
     4     IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
     5     if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
     6     {
     7         delete pAdapterInfo;
     8         pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
     9         pAdapterInfoBkp = pAdapterInfo;
    10     }
    11     if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
    12     {
    13         do{ // 遍历全部适配器
    14             if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) // 推断是否为以太网接口
    15             {
    16                 // pAdapterInfo->Description 是适配器描写叙述
    17                 // pAdapterInfo->AdapterName 是适配器名称
    18             }
    19             pAdapterInfo = pAdapterInfo->Next;
    20         }while(pAdapterInfo);
    21     }
    22     delete pAdapterInfoBkp;
    23 }

    AdapterName 也能得到网络连接的名称 如{C6DFC923-0895-4FCE-85F2-740E6133EC6D} 适配器描写叙述如:Realtek RTL8139(A) PCI Fast Ethernet Adapter

    第三种方法也是使用API:

     1 void __fastcall GetLanAdapterName()
     2 {   HANDLE   hMprConfig;
     3     DWORD   dwRet=0;
     4     CString   strInfo,strTmp;
     5     PIP_INTERFACE_INFO   plfTable=NULL;
     6     IP_ADAPTER_INDEX_MAP   AdaptMap;
     7     DWORD   dwBufferSize=0;
     8     WCHAR   szFriendName[256];
     9     DWORD   tchSize=sizeof(WCHAR)*256;
    10     ZeroMemory(&szFriendName,tchSize);
    11 
    12     dwRet=MprConfigServerConnect   (NULL,&hMprConfig);
    13     dwRet=GetInterfaceInfo(NULL,&dwBufferSize);
    14 
    15     if(dwRet == ERROR_INSUFFICIENT_BUFFER)
    16     {
    17         plfTable=(PIP_INTERFACE_INFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize);
    18         GetInterfaceInfo(plfTable,&dwBufferSize);
    19     }
    20     strInfo.Empty();
    21     for(UINT   i=0;i<plfTable->NumAdapters;i++)
    22     {
    23         AdaptMap=plfTable->Adapter[i];
    24         dwRet=MprConfigGetFriendlyName(hMprConfig,AdaptMap.Name,(PWCHAR)szFriendName,tchSize);
    25 
    26 
    27         char szName[256];
    28         memset( szName, 0, 256 );
    29         int nLen = WideCharToMultiByte( CP_ACP,NULL, szFriendName,-1,NULL,0,NULL,FALSE );
    30         WideCharToMultiByte (CP_ACP,NULL,szFriendName,-1,szName,nLen,NULL,FALSE);
    31         strTmp.Format(_T("Index:%u
    Name:%s
    "),AdaptMap.Index,szName);   //szName即为网络连接的名称
    32         strInfo+=strTmp;
    33     }
    34 
    35     HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,plfTable);
    36 }

    szName即为网络连接的名称,如 "本地连接","本地连接1"...后面通过API函数获取须要增加以下头文件

    1 #include <Mprapi.h>  
    2 #include <iphlpapi.h>  
    3 #pragma comment( lib, "Iphlpapi.lib" )  
    4 #pragma comment( lib, "Mprapi.lib" )

    当然, 我须要的是获取网络连接的显示名字,所以选择第三种方法

     AdaptMap.Index=pAdapterInfo->Index进行匹配

     

  • 相关阅读:
    【springboot】@Valid参数校验
    【springboot】事务处理
    【springboot】过滤器、监听器、拦截器,Aspect切片
    【java web】过滤器、拦截器、监听器的区别
    【java web】监听器listener
    【java web】拦截器inteceptor
    【java web】过滤器filter
    【权限管理】Apache Shiro和Spring Security的对比
    【面试题】挑战10个最难回答的Java面试题(附答案)
    【面试题】反向面试
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/10640403.html
Copyright © 2020-2023  润新知