Qt网络编程之获取网络信息

在网络编程中经常需要获取本地或远程主机的网络信息,如IP地址、子网掩码、广播地址等,Qt network模块中提供了一些方便的类,如QHostInfo、QNetworkInterface等。

本文将从三种情况介绍Qt网络编程中如何获取主机网络信息。


1.获取本机主机名和IP地址(利用QHostInfo类)

QHostInfo可以调用QHostInfo::localHostName()来获取本机主机名,并根据主机名来获取IP地址等信息,其中,所有的ip地址存放在QHostInfo::addresses()中。另外,根据address.protocol()可以筛选IPv4和IPv6地址。

示例:

    QString localHostName=QHostInfo::localHostName();
    qDebug()<<"Local host name:"<<localHostName;

    QHostInfo info=QHostInfo::fromName(localHostName);//根据上边获得的主机名来获取本机的信息

    foreach(QHostAddress address,info.addresses())//info.addresses()---QHostInfo的address函数获取本机ip地址
    {
        if(address.protocol()==QAbstractSocket::IPv4Protocol)//只取ipv4协议的地址
        qDebug()<<"IPV4 addresses:"<<address.toString();
        if(address.protocol()==QAbstractSocket::IPv6Protocol)//只取ipv6协议的地址
        qDebug()<<"IPV6 addresses:"<<address.toString();
    }


2.通过域名查找对应IP地址(利用QHostInfo类)

QHostInfo提供了一个强有力的查找成员lookupHost(),该函数基于信号与槽机制。

因此我们可以先定义一个继承自QObject的专用查找类,然后定义槽函数处理查找结果。


示例:

查找类LookupIp定义如下:

class LookupIp : public QObject
{
    Q_OBJECT
public:
    explicit LookupIp(QObject *parent=0);
    void startLookup(const QString &str);
    QString getHostName(void);
    void setHostName(const QString &name);

signals:

public slots:
    void lookedup(const QHostInfo &host);

private:
    QString hostName;
};
成员函数实现:

LookupIp::LookupIp(QObject *parent)
{
    qDebug()<<"start lookup IP...";
}

void LookupIp::startLookup(const QString &hostName)
{
    QHostInfo::lookupHost(hostName,this,SLOT(lookedup(QHostInfo)));
}

void LookupIp::setHostName(const QString &name)
{
    hostName=name;
}

QString LookupIp::getHostName()
{
    return hostName;
}


void LookupIp::lookedup(const QHostInfo &host)
{
    qDebug()<<"IP address of"<<hostName<<"is:";
    foreach(QHostAddress address,host.addresses())//info.addresses()---QHostInfo的address函数获取本机ip地址
    {
        if(address.protocol()==QAbstractSocket::IPv4Protocol)//只取ipv4协议的地址
        qDebug()<<"IPV4 addresses:"<<address.toString();
        if(address.protocol()==QAbstractSocket::IPv6Protocol)//只取ipv6协议的地址
        qDebug()<<"IPV6 addresses:"<<address.toString();
    }
}

3.获取本机完整的网络接口信息(利用QNetworkInterface类)

若想获取比较完整的网络信息,包括网卡等硬件信息,可以利用QNetworkInterface类,该类存储所有网络设备的设备名、Mac地址、IP地址、子网掩码、广播地址等。


示例:

 QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();//获取所有网络接口信息
    foreach(QNetworkInterface interface,list)
    {
        //遍历每一个接口信息
        qDebug()<<"Device:"<<interface.name();//设备名称
        qDebug()<<"HardwareAddress:"<<interface.hardwareAddress();//获取硬件地址
        QList<QNetworkAddressEntry>entryList=interface.addressEntries();//获取ip地址和子网掩码和广播地址
        foreach(QNetworkAddressEntry entry,entryList)
        {//遍历ip条目列表
            qDebug()<<"IP address:"<<entry.ip().toString();//获取ip
            qDebug()<<"Netmask:"<<entry.netmask().toString();//获取子网掩码
            qDebug()<<"Broadcast:"<<entry.broadcast().toString();//获取广播地址
        }
    }

关于Qt获取网络信息还有一些其他方法,本文给出的方法应该是比较方便快捷的,其他方法大家可以查看Qt帮助文档。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrlturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值