qt 获取IP地址(公网 本机)

这里写目录标题

获取本机IP地址

cpp 复制代码
QStringList Network::getIPNetMaskBroadcast()
{
    QStringList ipAddresses;
    foreach (const QNetworkInterface &interface, QNetworkInterface::allInterfaces())
    {
        //if(interface.flags() & QNetworkInterface::IsUp && !(interface.flags() & QNetworkInterface::IsLoopBack))
        foreach (const QNetworkAddressEntry &entry, interface.addressEntries())
        {
            if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress::LocalHost)
            {
                ipAddresses.append(entry.ip().toString());
                ipAddresses.append(entry.netmask().toString());
                ipAddresses.append(entry.broadcast().toString());
                qDebug()<<entry.ip().toString();
                qDebug()<<entry.netmask().toString();
                qDebug()<<entry.broadcast().toString();
            }
        }
    }
    return ipAddresses;
}

获取网关IP地址

cpp 复制代码
// 获取本机网关IP地址
QString Network::getGatewayIP() {
    QProcess process;
    process.start("netstat -rn");
    process.waitForFinished();
    QByteArray output = process.readAllStandardOutput();
    QStringList lines = QString(output).split('\n');
    int index = -1;
    foreach (const QString &line, lines) {
        if (!line.contains("UG") && !line.contains("Gateway"))
            continue;

        QStringList items = line.simplified().split(' ');
        if (items.contains("Gateway")) {
            index = items.indexOf("Gateway");
            continue;
        }

        if (items.contains("UG"))
            return items.at(index);

    }
    return QString();
}

获取公网IP地址

cpp 复制代码
// 获取本机公网IP地址
QString Network::GetExternalIP() {
    QNetworkConfigurationManager manager;
    if (manager.isOnline()) {
        // 1. 创建 QNetworkAccessManager 实例(通常只需一个全局实例)
        QNetworkAccessManager *manager = new QNetworkAccessManager(this);

        // 2. 创建 QNetworkRequest 实例并设置目标 URL 和请求头
        QNetworkRequest request;
        request.setUrl(QUrl("http://whois.pconline.com.cn/ipJson.jsp?json=true"));
        // 可选:设置请求头,如指定内容类型
        // request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));

        // 3. 发送请求,获取 QNetworkReply 对象
        QNetworkReply *reply = manager->get(request);

        QEventLoop loop;
        connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
        loop.exec();

        QString data = QString::fromLocal8Bit(reply->readAll());
          QJsonDocument jsonDocument = QJsonDocument::fromJson(data.toUtf8());
          QJsonObject jsonObject = jsonDocument.object();
          QString ip = jsonObject.value("ip").toString();
          //QString address = jsonObject.value("addr").toString().toUtf8();

          qDebug() << "ip:" << ip ;
         // qDebug() << "loaction:"<< address ;

        // 重要:请求完成后,需要释放 reply 对象
        reply->deleteLater();
        return ip;
    }
    return QString();
}
cpp 复制代码
#ifndef NETWORK_H
#define NETWORK_H

#include <QDialog>
#include <QFormLayout>
#include <QPushButton>
#include <QMessageBox>
#include <QDebug>
#include <QLineEdit>
#include <QLabel>
#include <QComboBox>
#include <QRadioButton>
#include <QString>

class Network : public QDialog
{
    Q_OBJECT
public:
    explicit Network(QWidget *parent = nullptr);

signals:

private slots:
    void onConfirmClicked();
private:
    QStringList getIPNetMaskBroadcast();
    QString getGatewayIP();
    QString GetExternalIP() ;
    void IpNetMaskBroadcastReadOnly(bool b);

private:
    QLineEdit *m_IpAddr;
    QLineEdit *m_NetMask;
    QLineEdit *m_Gateway;
    QLineEdit *m_WifiPass;
    QComboBox *m_WifiName;
    QRadioButton * m_RBAutomatic;
    QRadioButton * m_RBManual;
    QRadioButton * m_RBWiFi;
};

#endif // NETWORK_H
cpp 复制代码
#include "network.h"

#include <QFormLayout>
#include <QGroupBox>
#include <QHostAddress>
#include <QNetworkInterface>
#include <QDebug>
#include <QProcess>
#include <QNetworkConfigurationManager>
#include <QNetworkAccessManager>
#include <QEventLoop>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>

Network::Network(QWidget *parent) : QDialog(parent)
{
    setWindowTitle("网络设置");
    setAttribute(Qt::WA_DeleteOnClose);
    setFixedSize(350,240);

    QString ddvdvd = GetExternalIP();

    QFont font;
    font.setFamily(QString::fromUtf8("fzcy_GBK"));
    font.setPointSize(14);
    this->setFont(font);

    m_IpAddr = new QLineEdit();
    m_NetMask = new QLineEdit();
    m_Gateway = new QLineEdit();
    m_WifiPass = new QLineEdit();
    m_WifiName=new QComboBox();
    IpNetMaskBroadcastReadOnly(true);


    m_RBAutomatic= new QRadioButton("自动获取",this);
    m_RBManual= new QRadioButton("手动设置",this);
    m_RBWiFi= new QRadioButton("WiFi",this);
    m_RBAutomatic->setChecked(true);
    QHBoxLayout * HBoxLayout = new QHBoxLayout();
    //HBoxLayout->setAlignment(Qt::AlignCenter);
    HBoxLayout->addWidget(m_RBAutomatic);
    HBoxLayout->addWidget(m_RBManual);
    HBoxLayout->addWidget(m_RBWiFi);

    QGroupBox *groupBox = new QGroupBox(this);
    groupBox->setStyleSheet("QGroupBox {border:0px solid vlack;}");
    groupBox->setFixedWidth(350);
    groupBox->setLayout(HBoxLayout);

    QWidget *widget1 = new QWidget(this);
    widget1->setFixedWidth(350);
    widget1->move(0,50);

    QWidget *widget2 = new QWidget(this);
    widget2->setFixedWidth(350);
    widget2->move(0,50);
    widget2->hide();

    QFormLayout * fLayout1 = new QFormLayout(widget1);
    fLayout1->addRow(new QLabel("IP地址"),m_IpAddr);
    fLayout1->addRow(new QLabel("子网掩码"),m_NetMask);
    fLayout1->addRow(new QLabel("网关地址"),m_Gateway);
    QFormLayout * fLayout2 = new QFormLayout(widget2);
    fLayout2->addRow(new QLabel("Wifi名称"),m_WifiName);
    fLayout2->addRow(new QLabel("Wifi密码"),m_WifiPass);


    QPushButton * confirm = new QPushButton("确定",this);
    confirm->move(135,195);

    connect(confirm, &QPushButton::clicked, this, &Network::onConfirmClicked);

    connect(m_RBAutomatic, &QPushButton::clicked, [=]() {
        widget1->show(); widget2->hide(); IpNetMaskBroadcastReadOnly(true);
        QList<QString> List = getIPNetMaskBroadcast();
        m_IpAddr->setText(List[0]);m_NetMask->setText(List[1]);m_Gateway->setText(getGatewayIP());
    });
    connect(m_RBManual, &QPushButton::clicked, [=]() {widget1->show();widget2->hide();
    IpNetMaskBroadcastReadOnly(false);
    m_IpAddr->clear();m_NetMask->clear();m_Gateway->clear();});
    connect(m_RBWiFi, &QPushButton::clicked, [=]() {widget1->hide();widget2->show();});

}

void Network::onConfirmClicked()
{
    if(m_RBManual->isChecked()) {
        QString IpAddr = m_IpAddr->text();
        QString NetMask = m_NetMask->text();
        QString Broadcast = m_Gateway->text();

        if( IpAddr.isEmpty() || NetMask.isEmpty() || Broadcast.isEmpty())
            QMessageBox::warning(this,"错误","不能为空");
        qDebug()<<"m_RBManual";
    }
    else if(m_RBWiFi->isChecked()){
        qDebug()<<"m_RBWiFi";
    }
}

void Network::IpNetMaskBroadcastReadOnly(bool b)
{
     m_IpAddr->setReadOnly(b);
     m_NetMask->setReadOnly(b);
     m_Gateway->setReadOnly(b);
}

QStringList Network::getIPNetMaskBroadcast()
{
    QStringList ipAddresses;
    foreach (const QNetworkInterface &interface, QNetworkInterface::allInterfaces())
    {
        //if(interface.flags() & QNetworkInterface::IsUp && !(interface.flags() & QNetworkInterface::IsLoopBack))
        foreach (const QNetworkAddressEntry &entry, interface.addressEntries())
        {
            if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress::LocalHost)
            {
                ipAddresses.append(entry.ip().toString());
                ipAddresses.append(entry.netmask().toString());
                ipAddresses.append(entry.broadcast().toString());
                qDebug()<<entry.ip().toString();
                qDebug()<<entry.netmask().toString();
                qDebug()<<entry.broadcast().toString();
            }
        }
    }
    return ipAddresses;
}

// 获取本机网关IP地址
QString Network::getGatewayIP() {
    QProcess process;
    process.start("netstat -rn");
    process.waitForFinished();
    QByteArray output = process.readAllStandardOutput();
    QStringList lines = QString(output).split('\n');
    int index = -1;
    foreach (const QString &line, lines) {
        if (!line.contains("UG") && !line.contains("Gateway"))
            continue;

        QStringList items = line.simplified().split(' ');
        if (items.contains("Gateway")) {
            index = items.indexOf("Gateway");
            continue;
        }

        if (items.contains("UG"))
            return items.at(index);

    }
    return QString();
}




// 获取本机公网IP地址
QString Network::GetExternalIP() {
    QNetworkConfigurationManager manager;
    if (manager.isOnline()) {
        // 1. 创建 QNetworkAccessManager 实例(通常只需一个全局实例)
        QNetworkAccessManager *manager = new QNetworkAccessManager(this);

        // 2. 创建 QNetworkRequest 实例并设置目标 URL 和请求头
        QNetworkRequest request;
        request.setUrl(QUrl("http://whois.pconline.com.cn/ipJson.jsp?json=true"));
        // 可选:设置请求头,如指定内容类型
        // request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));

        // 3. 发送请求,获取 QNetworkReply 对象
        QNetworkReply *reply = manager->get(request);

        QEventLoop loop;
        connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
        loop.exec();

        QString data = QString::fromLocal8Bit(reply->readAll());
          QJsonDocument jsonDocument = QJsonDocument::fromJson(data.toUtf8());
          QJsonObject jsonObject = jsonDocument.object();
          QString ip = jsonObject.value("ip").toString();
          //QString address = jsonObject.value("addr").toString().toUtf8();

          qDebug() << "ip:" << ip ;
         // qDebug() << "loaction:"<< address ;

        // 重要:请求完成后,需要释放 reply 对象
        reply->deleteLater();
        return ip;
    }
    return QString();
}
相关推荐
Quz3 小时前
QML 拖拽篇:接收拖拽与数据交换
qt
BingoGo3 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.0 发布,新增短信服务能力
后端·php
草莓熊Lotso4 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
kekekzt16 小时前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip
张人玉20 小时前
基于 Python 机器学习 与 PyQt5 桌面框架开发的可视化分析系统——基于大数据的网上购物消费行为分析可视化大屏
python·qt·机器学习·echarts·three.js
「QT(C++)开发工程师」21 小时前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
纯.Pure_Jin(g)21 小时前
靶场PHP函数整理+防御方式
开发语言·php·ctf
Learn-Share_HY21 小时前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
小镇敲码人1 天前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
Fxkj8881 天前
企业新媒体IP陪跑真实价值解析:合作体验与效果评判标准
大数据·人工智能·tcp/ip·媒体