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();
}
相关推荐
微爱帮监所写信寄信17 分钟前
微爱帮监狱寄信写信工具照片高清处理技术架构
开发语言·人工智能·网络协议·微信·php
li星野1 小时前
TCP 套接字+TLS+HTTP 基本认证
网络协议·tcp/ip·http
天下皆白_唯我独黑2 小时前
php -S 启动项目访问路由报错处理
开发语言·php
清水迎朝阳2 小时前
Qt 小白成长系列 1-- 官方 文本搜索示例解析
开发语言·qt
深蓝海拓2 小时前
PySide6从0开始学习的笔记(二十一) 使用loadUi直接加载.ui文件
笔记·python·qt·学习·ui·pyqt
十五年专注C++开发3 小时前
浅谈Qt中的QSql模块整体设计
开发语言·数据库·c++·qt
梅羽落3 小时前
python武器化开发_01
开发语言·python·php
兮动人3 小时前
Fatal error: Uncaught think\exception\ErrorException: SourceGuardian Loade
android·php
爱学java的ptt4 小时前
TCP详解
网络·网络协议·tcp/ip