VC获取IP、子网掩码、网关、广播地址

#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>

#include <windows.h>

using namespace std;

typedef struct tagAdapterInfo
{
    string strName;            // 适配器名称
    string strDriverDesc;      // 适配器描述
    string strIP;              // IP地址
    string strNetMask;         // 子网掩码
    string strNetGate;         // 网关
    string strBroadcastIp;     // 广播地址
    string strS;               // 测试用的
}ADAPTER_INFO;

BOOL GetAdapterInfo();
BOOL RegGetIP(ADAPTER_INFO *pAI, LPCTSTR lpszAdapterName, int nIndex = 0);

vector<ADAPTER_INFO*> AdapterInfoVector;

int main()
{
    GetAdapterInfo();
    int i;
    for (i = 0;i < AdapterInfoVector.size();i++)
    {
        cout << AdapterInfoVector[i]->strName << ":" << endl << endl;
        cout << "        " << AdapterInfoVector[i]->strDriverDesc << endl;
        cout << "        " << AdapterInfoVector[i]->strIP << endl;
        cout << "        " << AdapterInfoVector[i]->strNetMask << endl;
        cout << "        " << AdapterInfoVector[i]->strNetGate << endl;
        cout << "        " << AdapterInfoVector[i]->strBroadcastIp << endl;
        cout << endl;

    }
        ::Sleep(10000);
    return 0;
}

//—————————————————————–
//    取得所有网卡信息
//—————————————————————–
BOOL GetAdapterInfo()
{
    // 这里的代码适合WINDOWS2000,对于NT需要读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
    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 FALSE;

    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(strstr((char*)szData, "ethernet") != NULL)//    判断是不是以太网卡
                    {
                        dwBufSize = 256;
                        if(RegQueryValueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
                        {
                            ADAPTER_INFO *pAI = new ADAPTER_INFO;
                            pAI->strDriverDesc = (LPCTSTR)szData;
                            dwBufSize = 256;
                            if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
                            {
                                pAI->strS = (LPCTSTR)szData;
                                RegGetIP(pAI, (LPCTSTR)szData);
                            }
                            AdapterInfoVector.push_back(pAI);    // 加入到容器中
                        }
                    }
                }
                RegCloseKey(hNdiIntKey);
            }
            RegCloseKey(hSubKey);
        }

        dwBufSize = 256;
    }    /* end of while */
        
    RegCloseKey(hKey);
    return true;
}

//—————————————————————–
//    得到注册表中的IP信息
//    nIndex暂时未处理
//—————————————————————–

BOOL RegGetIP(ADAPTER_INFO *pAI, LPCTSTR lpszAdapterName, int nIndex/* =0 */)
{
    //ASSERT(pAI);
    HKEY hKey, hSubKey, hNdiIntKey;
   
    string strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
    strKeyName += lpszAdapterName;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                strKeyName.c_str(),
                0,
                KEY_READ,
                &hKey) != ERROR_SUCCESS)
        return FALSE;

    unsigned char szData[256];
    DWORD dwDataType, dwBufSize;
    dwBufSize = 256;
    if(RegQueryValueEx(hKey, "DhcpIPAddress", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
        pAI->strIP = (LPCTSTR)szData;
    else{
        if(RegQueryValueEx(hKey, "IPAddress", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
        pAI->strIP = (LPCTSTR)szData;
    }
    
   

    dwBufSize = 256;
    if(RegQueryValueEx(hKey, "DhcpSubnetMask", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
        pAI->strNetMask = (LPCTSTR)szData;
    else
    {
        if(RegQueryValueEx(hKey, "SubnetMask", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
            pAI->strNetMask = (LPCTSTR)szData;
    }
   

    dwBufSize = 256;
    if(RegQueryValueEx(hKey, "DhcpDefaultGateway", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
        pAI->strNetGate = (LPCTSTR)szData;
    else
    {
        if(RegQueryValueEx(hKey, "DefaultGateway", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
            pAI->strNetGate = (LPCTSTR)szData;
    }
    
    
    RegCloseKey(hKey);

    strKeyName = "SYSTEM\\ControlSet001\\Control\\Network";
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                strKeyName.c_str(),
                0,
                KEY_READ,
                &hKey) != ERROR_SUCCESS)
        return FALSE;
    char szSubKey[256];
    char szSubKey_two[256];
    memset(szSubKey, 0, 256);
    DWORD dwIndex = 0;
    DWORD dwIndex_two = 0;
    dwBufSize = 256;
    DWORD dwBufSize_two = 256;
    pAI->strName = pAI->strDriverDesc;
    while(RegEnumKey(hKey, dwIndex++, szSubKey, dwBufSize) == ERROR_SUCCESS)
    {
        string strKeyName_two;
        strKeyName_two = strKeyName + "\\";
        strKeyName_two +=  szSubKey;
        if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
        {
            while(RegEnumKey(hSubKey, dwIndex_two++, szSubKey_two, dwBufSize_two) == ERROR_SUCCESS)
            {
                 if (strstr(szSubKey_two, lpszAdapterName) != NULL)
                 {
                     strcat(szSubKey_two, "\\Connection");
                     if(RegOpenKeyEx(hSubKey, szSubKey_two, 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)
                     {
                         if(RegQueryValueEx(hNdiIntKey, "Name", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
                         {
                             pAI->strName = (LPCTSTR)szData;
                             break;
                         }

                         RegCloseKey(hNdiIntKey);
                     }
                     
                 }
            }
            RegCloseKey(hSubKey);
        }
    }
    RegCloseKey(hKey);
    
     /*
        算法: 
        1. 子网掩码与IP地址进行位与运算,得处网络地址
        2. 网络地址 | (~子网掩码),得出广播地址
        */
        in_addr broadcast;
        broadcast.S_un.S_addr = (
                            inet_addr(pAI->strIP.c_str()) 
                            & inet_addr(pAI->strNetMask.c_str())
                           )
                           | (~inet_addr(pAI->strNetMask.c_str()));
    pAI->strBroadcastIp = inet_ntoa(broadcast);
    return TRUE;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值