qt获取IP、网关地址

最近由于项目需要使用socket通信,要获取网关地址,于是上网搜了一下
首先我们要添加iphlpapi.lib库,从而获得windows下一些基本的网络连接信息。

函数 作用
GetNumberOfInterfaces() 获取当前的网络接口数目
GetIfTable() 得到所有网络接口的信息
GetIpAddrTable() 获取ip到网络接口
GetIpNetTable() IP到网卡地址的映射
GetTcpTable() 获取当前TCP连接状况
GetUdpTable() 获取当前UDP连接状况
GetIpStatistics()GetIcmpStatistics() GetTcpStatistics() GetUdpStatistics() 得到当前各协议的主要参数和信息
GetAdapterIndex() GetAdaptersInfo() GetAdaptersAddresses() 得到关于网卡的信息
AddIPAddress() 设置IP
SendARP() 发送一个arp请求,获得一个物理地址所对应的IP地址

添加lib方法摘自:http://blog.csdn.net/alspwx/article/details/12649225
qt中添加lib库是在.pro工程文件中添加,格式如下:

LIBS += -L(lib所在目录) -l(lib库名,不要后缀)
如下所示:

LIBS += -LF:/MyProgram/QT_DSP531Project/ -lIPHLPAPI

完成以上的操作,就可以指定.lib文件了。其实说穿了很简单,就是把.lib随便放到一个目录下,然后告诉工程,你的.lib放到哪里了,叫什么名字。

添加完库后,调用代码:

#include 
#include 
#include 
#include 
#include //或者#pragma comment(lib, "iphlpapi.lib")

QString getHostIpByWinSock()  //获取本机IP地址
{
    QString IP;
    QList ipAddressesList = QNetworkInterface::allAddresses();
    for (int i = 0; i < ipAddressesList.size(); ++i)
    {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
        ipAddressesList.at(i).toIPv4Address())
        {
            // 如果这个地址不是127.0.0.1,并且是IPv4的地址,就将其赋值给IP,并结束for循环
            IP = ipAddressesList.at(i).toString();
            break;
        }
    }
    // 如果IP为空,则将其赋值为127.0.0.1
    if (IP.isEmpty())
        IP = QHostAddress(QHostAddress::LocalHost).toString();
    return IP;
}
QString getGateway()  //获取网关地址
{
    PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
    unsigned long stSize = sizeof(IP_ADAPTER_INFO);
    int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
    if (ERROR_BUFFER_OVERFLOW == nRel){
        // ERROR_BUFFER_OVERFLOW:内存空间不够
        // 释放原来的内存空间
        delete pIpAdapterInfo;
        // 重新申请内存空间用来存储所有网卡信息
        pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
        // 再次调用GetAdaptersInfo
        nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
    }
    if (ERROR_SUCCESS == nRel){
        while (pIpAdapterInfo){
            switch(pIpAdapterInfo->Type){
            case MIB_IF_TYPE_OTHER:
                break;
            case MIB_IF_TYPE_ETHERNET:
                break;
            case MIB_IF_TYPE_TOKENRING:
                break;
            case MIB_IF_TYPE_FDDI:
                break;
            case MIB_IF_TYPE_PPP:
                break;
            case MIB_IF_TYPE_LOOPBACK:
                break;
            case MIB_IF_TYPE_SLIP:
                break;
            default:
                break;
            }
            for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
                if (i < pIpAdapterInfo->AddressLength-1){
                }
                else{
                }
                // 多个网卡、多个IP
                IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
                do{
                    if(QString(pIpAddrString->IpAddress.String) == getHostIpByWinSock()){
                        return QString(pIpAdapterInfo->GatewayList.IpAddress.String);
                    }
                    pIpAddrString=pIpAddrString->Next;
                } while (pIpAddrString);
                pIpAdapterInfo = pIpAdapterInfo->Next;
        }

    }
    //释放内存空间
    if (pIpAdapterInfo){
        delete pIpAdapterInfo;
    }

    return "0.0.0.0";
}

亲测成功!
qt获取IP、网关地址_第1张图片

示例代码:https://github.com/Dufre/GetNetworkInformation

你可能感兴趣的:(C/C++)