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();
}
相关推荐
了一梨3 小时前
网络编程:TCP Socket
linux·c语言·tcp/ip
互亿无线明明3 小时前
国际短信通知服务:如何为全球业务构建稳定的跨国消息触达体系?
java·c语言·python·php·objective-c·ruby·composer
FPGA技术实战3 小时前
基于XADC IP核的FPGA芯片温度读取设计
网络协议·tcp/ip·fpga开发
ULTRA??3 小时前
QT向量实现GJK碰撞检测算法几何图形二维版本
c++·qt·算法
老蒋新思维4 小时前
范式重构:从场景锚点到价值闭环——AI智能体落地知识产业的非技术视角|创客匠人
网络·人工智能·网络协议·tcp/ip·数据挖掘·创始人ip·创客匠人
我要升天!4 小时前
QT -- QSS界面优化
开发语言·c++·qt
ICT技术最前线4 小时前
电信宽带怎么申请公网ip?企业组网避坑指南
网络·网络协议·tcp/ip·电信宽带
Q_Q5110082855 小时前
python+springboot+django/flask基于深度学习的音乐推荐系统
spring boot·python·django·flask·node.js·php
Q_Q5110082856 小时前
python+springboot+django/flask基于深度学习的淘宝用户购物可视化与行为预测系统
spring boot·python·django·flask·node.js·php