获取当前电脑所有网络连接名字



最近因为项目有需要获取本机的所有存在的网络连接名称,在网上也找了资料,有好几种方法,不过就只有一种是能够达到我想要的要求

写下来给大家参考下

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

void __fastcall MyGetLanAdapterName(char *szLanAdapterName)
{
    HKEY hKey, hSubKey, hNdiIntKey;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        "System\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}",
        0,
        KEY_READ,
        &hKey) != ERROR_SUCCESS)
        return;

    DWORD dwIndex = 0;
    DWORD dwBufSize = 256;
    DWORD dwDataType;
    char szSubKey[256];
    unsigned char szData[256];

    while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
    {
        if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
        {
            if(RegOpenKeyEx(hSubKey, "Ndi\\Interfaces", 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)
            {
                dwBufSize = 256;
                if(RegQueryValueEx(hNdiIntKey, "LowerRange", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
                {
                    if(strcmp((char*)szData, "ethernet") == 0) // 判断是不是以太网卡
                    {
                        dwBufSize = 256;
                        if(RegQueryValueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
                        {
                            // szData 中便是适配器详细描述
                            dwBufSize = 256;
                            if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
                            {
                                //szData中便是适配器名称
                                strcpy(szLanAdapterName, (char *)szData);
                            }
                        }
                    }
                }
                RegCloseKey(hNdiIntKey);
            }
            RegCloseKey(hSubKey);
        }
        dwBufSize = 256;
    } /* end of while */
    RegCloseKey(hKey);
}

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

第二种方法是通过API:

void __fastcall GetLanAdapterName()
{
    ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
    IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
    if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
    {
        delete pAdapterInfo;
        pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
        pAdapterInfoBkp = pAdapterInfo;
    }
    if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
    {
        do{ // 遍历所有适配器
            if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) // 判断是否为以太网接口
            {
                // pAdapterInfo->Description 是适配器描述
                // pAdapterInfo->AdapterName 是适配器名称
            }
            pAdapterInfo = pAdapterInfo->Next;
        }while(pAdapterInfo);
    }
    delete pAdapterInfoBkp;
}

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

第三种方法也是使用API:

void __fastcall GetLanAdapterName()
{   HANDLE   hMprConfig;
    DWORD   dwRet=0;
    CString   strInfo,strTmp;
    PIP_INTERFACE_INFO   plfTable=NULL;
    IP_ADAPTER_INDEX_MAP   AdaptMap;
    DWORD   dwBufferSize=0;
    WCHAR   szFriendName[256];
    DWORD   tchSize=sizeof(WCHAR)*256;
    ZeroMemory(&szFriendName,tchSize);

    dwRet=MprConfigServerConnect   (NULL,&hMprConfig);
    dwRet=GetInterfaceInfo(NULL,&dwBufferSize);

    if(dwRet==ERROR_INSUFFICIENT_BUFFER)
    {
        plfTable=(PIP_INTERFACE_INFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize);
        GetInterfaceInfo(plfTable,&dwBufferSize);
    }
    strInfo.Empty();
    for(UINT   i=0;i<plfTable->NumAdapters;i++)
    {
        AdaptMap=plfTable->Adapter[i];
        dwRet=MprConfigGetFriendlyName(hMprConfig,AdaptMap.Name,(PWCHAR)szFriendName,tchSize);

        char szName[256];
        memset( szName, 0, 256 );
        int nLen = WideCharToMultiByte( CP_ACP,NULL, szFriendName,-1,NULL,0,NULL,FALSE );
        WideCharToMultiByte (CP_ACP,NULL,szFriendName,-1,szName,nLen,NULL,FALSE);
        strTmp.Format(_T("Index:%u\nName:%s\n"),AdaptMap.Index,szName);   //szName即为网络连接的名称
        strInfo+=strTmp;
    }

    HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,plfTable);
}

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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 10:14:36

获取当前电脑所有网络连接名字的相关文章

android设备判断网络连接状态

android开发中,在做网络请求前判断当前网络连接状态有时很有必要.本文将介绍如何获取android设备当前网络连接状态! 所需权限(AndroidManifest.xml文件中添加): <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> Java代码(MainActivity.java文件) package com.example.androidtest; import a

iOS下的实际网络连接状态检测:RealReachability

序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部分iOS开发者来说,从苹果示例代码改变而来的各种Reachablity框架是实现这个需求的普遍选择,比如这个库.但事实上,基于此方案的所有实现,都无法帮助我们检测真正的网络连接状态,它们能检测的只是本地连接状态:这种情况包括但不限于如下场景: 1.现在很流行的公用wifi,需要网页鉴权,鉴权之前无法上网,但本地连接已经建立: 2.

无线网络连接一直显示正在获取网络地址,无法上网

在家用还好好的,也是无线连接,没有任何问题,连其他的无限网络也完全没问题,就是宿舍的无线就连不上,密码正确,其他人电脑和手机都能连上,求助!!!到底哪里出问题了,对了,我的电脑重装过,但是连其他网络网络没问题.重启过也不行 以前能连上的,修复显示的是无法续订IP地址 手动分配IP. 192.168.1.100--255(只要和别人的不同) 255.255.255.0 192.168.1.1 其他的不填 确定后.再改回自动获取 然后再试下连接 http://zhidao.baidu.com/que

android中NetWorkReceive以及获取当前的网络连接状态详解

我们现在APP是断然很难离开网络存活下去,会有很多很频繁的网络操作,请求数据,传递数据等等,所以,我们需要对网络状态有多一点的了解. 首先,假如我们的APP在运行的时候,假如这时候用户掉线了,没有网络了,我们就应该给用户提示,然后用户连上网络了,我们这时候应该也给用户提示,这样他就可以继续玩我们的APP,我们应该怎么做了,没错,就是通过Receiver来实现,因为断网和联网系统都会发送广播,然后,我们可以收到,通过广播去判断当前的网络是否可用,具体代码如下:其中,接受广播需要的action是"a

Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面

http://www.mobiletuts.me 获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager  类,用于网络连接状态的检测. Android开发文档这样描述ConnectivityManager 的作用: Class that answers queries about the state of network connectivi

Android编程 获取网络连接状态 及调用网络配置界面

获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用于网络连接状态的检测. Android开发文档这样描述ConnectivityManager的作用: Class that answers queries about the state of network connectivity. It also notifies applic

android 获取网络连接信息

效果图: 工具类 /** * 获取网络连接信息 * * 根据NetworkInfo可以知道有很多的连接方式和信息 * * ① 当没有任何可用网络的时候,networkinfo为null 判断networkinfo是否为null * * ② 当只有wifi网络或者wifi网络和移动网络同时存在的时候,返回wifi网络连接信息 * * NetworkInfo参数如下: * * detailedState:CONNECTED(连接状态) * * extraInfo:yiteng1(wifi网络名称)

Android编程获取网络连接状态及调用网络配置界面

获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用于网络连接状态的检测. Android开发文档这样描述ConnectivityManager的作用: Class that answers queries about the state of network connectivity. It also notifies applic

无线网卡连接internet,有线网卡向另一台电脑分享网络(笔记本当有线路由器)

有一台笔记本和一台台式机,都放在卧室内 笔记本能用无线网卡连接到客厅的路由器,台式机没有配备无线网卡,不能上网 要从客厅的路由器那边拉一条网线到卧室内连接台式机显然很蠢,在卧室内购置一台中继路由器也不太经济 最简单直接的方法就是,笔记本通过无线连接客厅的路由器连接到internet之后 再把有线网卡和台式机的网卡进行有线连接,向台式机分享网络 由于这方面不是很懂,稍微折腾了一下才搞定 网上已有的资料有些乱,还是自己简单整理记录一下步骤,以供以后在外遇到同样的问题的时候解决问题 1.在网络与共享中