C++获取当前正在使用的网卡的IP地址信息

0 1355
索鸟 2020-07-29
需要:0索币

inline PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder)  
{  
    PMIB_IPFORWARDTABLE pIpRouteTab = NULL;  
    DWORD dwActualSize = 0;  
      
    // 查询所需缓冲区的大小  
    if(::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)  
    {  
        // 为MIB_IPFORWARDTABLE结构申请内存  
        pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);  
        // 获取路由表  
        if(::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)  
            return pIpRouteTab;  
        ::GlobalFree(pIpRouteTab);  
    }  
    return NULL;  
}  

inline void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab)  
{  
    if(pIpRouteTab != NULL)  
    {
        ::GlobalFree(pIpRouteTab);
        pIpRouteTab == NULL;
    }
}


inline int GetCurrentUsingIp(in_addr *DesIpAddr,in_addr *SourceIpAddr)  

{  
    PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE);  
    if(pIpRouteTable != NULL)  
    {  
        DWORD i, dwCurrIndex;  
        struct in_addr inadDest;  
        struct in_addr inadMask;  
        struct in_addr inadGateway;    
        char szDestIp[128]={0};
        char szMaskIp[128]={0};
        char szGatewayIp[128]={0};
        DWORD  IfIndex = 0;
        DWORD    ForwardMetric1=0;
        if(pIpRouteTable->dwNumEntries>0)
        {
            int i=0;
            for (i = 0; i < pIpRouteTable->dwNumEntries; i++)  
            {  
                dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;  
                // 目的地址  
                inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;  
                strcpy_s(szDestIp, sizeof (szDestIp), inet_ntoa(inadDest));
                // 子网掩码  
                inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;  
                strcpy_s(szMaskIp, sizeof (szDestIp), inet_ntoa(inadMask));
                // 网关地址  
                inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;  
                strcpy_s(szGatewayIp, sizeof (szDestIp), inet_ntoa(inadGateway));
                if ((strcmp(szDestIp,"0.0.0.0")==0)&&(strcmp(szMaskIp,"0.0.0.0")==0))

                {

                      if (i==0)
                    {
                        ForwardMetric1= pIpRouteTable->table[i].dwForwardMetric1;
                        IfIndex=  pIpRouteTable->table[i].dwForwardIfIndex;
                        struct in_addr inadDest;
                        inadDest.s_addr =pIpRouteTable->table[i].dwForwardDest;
                       *DesIpAddr=inadDest;
                    }

                    else if(ForwardMetric1> pIpRouteTable->table[i].dwForwardMetric1)
                    {
                        ForwardMetric1= pIpRouteTable->table[i].dwForwardMetric1;
                        IfIndex=  pIpRouteTable->table[i].dwForwardIfIndex;
                        struct in_addr inadDest;
                        inadDest.s_addr =pIpRouteTable->table[i].dwForwardDest;
                       *DesIpAddr=inadDest;
                    }
                }
            }  
        }
        else
        {
            MyFreeIpForwardTable(pIpRouteTable);  
            return IPROUTETABLEZERO;
        }
        MyFreeIpForwardTable(pIpRouteTable);  

        ////////////
        if (IfIndex>0)
        {
            DWORD ipdwSize = 0;
            DWORD ipdwRetval;
            PBYTE   m_pBuffer=new BYTE[MAX_PATH];
            ULONG   m_ulSize=MAX_PATH;
            MIB_IPADDRTABLE *pIPAddrTable;
            DWORD  m_dwResult;
            PMIB_IPADDRTABLE    pAddrTable;
            PMIB_IPADDRROW      pAddrRow;
            in_addr             ia;
            GetIpAddrTable((PMIB_IPADDRTABLE) m_pBuffer, &m_ulSize, TRUE);
            delete[] m_pBuffer;
            m_pBuffer = new BYTE[m_ulSize];
            if (NULL != m_pBuffer)
            {
                m_dwResult = GetIpAddrTable((PMIB_IPADDRTABLE) m_pBuffer, &m_ulSize, TRUE);
                if (m_dwResult == NO_ERROR)
                {
                    pAddrTable = (PMIB_IPADDRTABLE) m_pBuffer;

                    for (int x = 0; x < pAddrTable->dwNumEntries; x++)
                    {
                        pAddrRow = (PMIB_IPADDRROW) &(pAddrTable->table[x]);

                        ia.S_un.S_addr = pAddrRow->dwAddr;
                        char IPMsg[100]={0};
                        if (IfIndex == pAddrRow->dwIndex)
                        {
                            *SourceIpAddr=ia;
                            delete[] m_pBuffer;
                            return SUCCESS;
                        }
                    }
                }
                else
                {
                    //MessageBoxA(NULL,"获取IP地址失败","Error",0);
                }
                delete [] m_pBuffer;
            }
        }
    }  
    else
    {
        MyFreeIpForwardTable(pIpRouteTable);  
        return NOIPROUTETABLE;
    }
    return NOIPROUTETABLE;

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0