最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt中QHostInfo::lookupHost()函數(shù)的方法示例

 更新時(shí)間:2025年12月14日 15:21:09   作者:華麗的周遭  
QHostInfo::lookupHost()是Qt網(wǎng)絡(luò)模塊提供的異步主機(jī)信息查詢(xún)接口,用于根據(jù)主機(jī)名或IP字符串查詢(xún)對(duì)應(yīng)的主機(jī)信息,下面就來(lái)詳細(xì)的介紹一下該函數(shù),感興趣的可以了解一下

一、函數(shù)核心定位

QHostInfo::lookupHost()是Qt網(wǎng)絡(luò)模塊提供的異步主機(jī)信息查詢(xún)接口,用于根據(jù)主機(jī)名(如www.example.com)或IP字符串,查詢(xún)對(duì)應(yīng)的主機(jī)信息(如IP地址列表、別名)。

它的核心價(jià)值是不阻塞調(diào)用線(xiàn)程(如GUI主線(xiàn)程),適合需要“后臺(tái)解析+前臺(tái)響應(yīng)”的場(chǎng)景(比如流媒體播放器輸入域名后,異步解析IP再連接服務(wù)器,避免界面卡頓)。

二、函數(shù)原型與關(guān)鍵參數(shù)

lookupHost()有兩個(gè)重載版本,最常用的是基于回調(diào)對(duì)象+槽函數(shù)的版本:

static void lookupHost(
    const QString &host,          // 主機(jī)名/IP字符串
    QObject *receiver,            // 接收結(jié)果的QObject派生類(lèi)對(duì)象
    const char *member            // receiver的槽函數(shù)/成員函數(shù)(需接受QHostInfo參數(shù))
);

還有一個(gè)返回LookupHost*的版本(用于手動(dòng)管理查詢(xún)生命周期):

static LookupHost *lookupHost(
    const QString &host,          // 主機(jī)名/IP字符串
    QObject *receiver,            // 接收結(jié)果的QObject
    const char *member            // 回調(diào)槽函數(shù)
);
// 或簡(jiǎn)化為:
static LookupHost *lookupHost(const QString &host, QObject *receiver, PointerToMemberFunction member);

1. 參數(shù)細(xì)節(jié)

host:

可以是主機(jī)域名(如"stream.example.com")或IP地址字符串(如"192.168.1.100")。如果是IP,查詢(xún)會(huì)直接返回該IP的封裝(無(wú)DNS請(qǐng)求)。

receiver:

必須是QObject的派生類(lèi)對(duì)象(如QWidget、QObject子類(lèi)),用于接收查詢(xún)結(jié)果。必須保證查詢(xún)完成前receiver未被銷(xiāo)毀(否則會(huì)導(dǎo)致野指針崩潰)。

member:

receiver的槽函數(shù)或成員函數(shù),簽名必須嚴(yán)格為:void func(const QHostInfo &info)。例如:

// 正確的槽函數(shù)聲明
void MyWidget::onLookupFinished(const QHostInfo &hostInfo);

三、異步工作機(jī)制

調(diào)用lookupHost()后,Qt會(huì)基于操作系統(tǒng)的DNS解析機(jī)制(如Linux下的resolv.conf、systemd-resolved;Windows的DNS Client服務(wù))發(fā)起異步查詢(xún),不會(huì)阻塞當(dāng)前線(xiàn)程

DNS查詢(xún)完成后,Qt的事件循環(huán)會(huì)觸發(fā)回調(diào):

  • 若使用receiver+member版本:自動(dòng)調(diào)用receiver->member(hostInfo);
  • 若使用LookupHost*版本:可通過(guò)LookupHost對(duì)象管理查詢(xún)(如abort()取消)。

四、結(jié)果處理:QHostInfo類(lèi)

回調(diào)函數(shù)的核心參數(shù)是QHostInfo對(duì)象,它封裝了查詢(xún)結(jié)果和狀態(tài):

1. 關(guān)鍵屬性/方法

方法/屬性

說(shuō)明

addresses()

返回解析到的IP地址列表(QList<QHostAddress>),包含IPv4/IPv6。

hostName()

返回查詢(xún)的主機(jī)名(若輸入是IP,則返回該IP的反向解析主機(jī)名,可能為空)。

error()

錯(cuò)誤碼(QHostInfo::HostInfoError枚舉),NoError表示成功。

errorString()

錯(cuò)誤描述字符串(如"Host not found")。

localDomainName()

本地域名稱(chēng)(較少用)。

2. 示例:處理查詢(xún)結(jié)果

假設(shè)我們需要解析流媒體服務(wù)器域名并連接:

// 頭文件
#include <QHostInfo>
#include <QDebug>
#include <QTcpSocket>
 
class StreamMonitor : public QWidget {
    Q_OBJECT
public:
    StreamMonitor(QWidget *parent = nullptr) : QWidget(parent) {
        // 假設(shè)有一個(gè)按鈕觸發(fā)查詢(xún)
        connect(&m_lookupButton, &QPushButton::clicked, this, &StreamMonitor::lookupServer);
    }
 
private slots:
    void lookupServer() {
        QString serverHost = "stream.example.com"; // 流媒體服務(wù)器域名
        // 異步查詢(xún),回調(diào)到onLookupFinished
        QHostInfo::lookupHost(serverHost, this, &StreamMonitor::onLookupFinished);
    }
 
    void onLookupFinished(const QHostInfo &hostInfo) {
        // 1. 錯(cuò)誤處理
        if (hostInfo.error() != QHostInfo::NoError) {
            qWarning() << "DNS解析失?。? << hostInfo.errorString();
            return;
        }
 
        // 2. 獲取IP列表(過(guò)濾IPv4,流媒體常用)
        QList<QHostAddress> ips = hostInfo.addresses();
        for (const QHostAddress &ip : ips) {
            if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
                qDebug() << "解析到IPv4地址:" << ip.toString();
                // 嘗試連接流媒體服務(wù)器(比如RTSP/HTTP)
                m_tcpSocket.connectToHost(ip, 554); // RTSP默認(rèn)端口554
                break; // 取第一個(gè)IPv4地址(可根據(jù)需求調(diào)整)
            }
        }
    }
 
private:
    QPushButton m_lookupButton;
    QTcpSocket m_tcpSocket;
};

五、高級(jí)用法:LookupHost對(duì)象

lookupHost()的第二個(gè)重載返回QHostInfo::LookupHost*,可用于手動(dòng)管理查詢(xún)生命周期

// 發(fā)起查詢(xún)并保存LookupHost對(duì)象
QHostInfo::LookupHost *lookup = QHostInfo::lookupHost("stream.example.com", this, &StreamMonitor::onLookupFinished);
 
// 若用戶(hù)取消輸入,可終止查詢(xún)
lookup->abort(); // 終止后,onLookupFinished仍會(huì)被調(diào)用,但error()為AbortedError

六、注意事項(xiàng)

Receiver生命周期

必須保證查詢(xún)完成前receiver未被銷(xiāo)毀。若不確定,可使用QPointer<QObject>跟蹤:

QPointer<QObject> m_receiver; // 成員變量
void StreamMonitor::lookupServer() {
    m_receiver = this;
    QHostInfo::lookupHost("server.com", m_receiver.data(), &StreamMonitor::onLookupFinished);
}

緩存策略

Qt默認(rèn)會(huì)緩存DNS結(jié)果(減少重復(fù)查詢(xún))。若需強(qiáng)制刷新,可:

QHostInfo::setCacheEnabled(false); // 禁用緩存
// 或清除緩存
QHostInfo::clearCache();

IPv4/IPv6過(guò)濾

addresses()返回所有解析到的IP,需根據(jù)場(chǎng)景過(guò)濾(如嵌入式設(shè)備可能僅支持IPv4):

for (const QHostAddress &ip : hostInfo.addresses()) {
    if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
        // 處理IPv4
    }
}

跨平臺(tái)一致性

基于操作系統(tǒng)DNS解析,行為在Windows/Linux/macOS上一致,無(wú)需適配底層差異。

七、與QDnsLookup的區(qū)別

Qt5.2引入了QDnsLookup(專(zhuān)門(mén)處理DNS查詢(xún)的類(lèi)),與QHostInfo的關(guān)系:

  • QHostInfo更輕量,適合快速查詢(xún)主機(jī)名→IP的場(chǎng)景;
  • QDnsLookup更靈活,支持查詢(xún)MX記錄、TXT記錄等,適合需要更細(xì)粒度DNS控制的場(chǎng)景。

對(duì)于流媒體應(yīng)用,QHostInfo已足夠滿(mǎn)足“域名→IP”的核心需求。

八、在Zynq MP嵌入式場(chǎng)景的價(jià)值

Zynq MP是ARM+FPGA的SoC,運(yùn)行嵌入式Linux。QHostInfo的優(yōu)勢(shì):

  • 異步不阻塞:避免解析DNS時(shí)卡住GUI或流媒體處理線(xiàn)程;
  • 跨平臺(tái)兼容:無(wú)需關(guān)心Linux內(nèi)核DNS配置(如/etc/resolv.conf),Qt自動(dòng)處理;
  • 簡(jiǎn)單易用:相比直接調(diào)用getaddrinfo(系統(tǒng)API),QHostInfo封裝了細(xì)節(jié),代碼更簡(jiǎn)潔。

總結(jié)

QHostInfo::lookupHost()是Qt中異步解析主機(jī)名/IP的核心接口,通過(guò)回調(diào)機(jī)制實(shí)現(xiàn)非阻塞查詢(xún),適合需要“后臺(tái)解析+前臺(tái)響應(yīng)”的場(chǎng)景(如流媒體服務(wù)器連接、設(shè)備發(fā)現(xiàn))。

使用時(shí)需注意Receiver生命周期、錯(cuò)誤處理IP過(guò)濾,結(jié)合QHostInfo的結(jié)果封裝,能快速實(shí)現(xiàn)DNS解析功能,提升嵌入式產(chǎn)品的用戶(hù)體驗(yàn)。

到此這篇關(guān)于Qt中QHostInfo::lookupHost()函數(shù)的方法示例的文章就介紹到這了,更多相關(guān)Qt QHostInfo::lookupHost()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

磐石市| 温州市| 出国| 田东县| 龙南县| 丁青县| 德昌县| 宜城市| 陆丰市| 丹棱县| 吕梁市| 浦北县| 沁源县| 利津县| 泽州县| 九寨沟县| 綦江县| 保德县| 朝阳县| 罗山县| 金华市| 高尔夫| 扬中市| 邹城市| 龙江县| 马公市| 威远县| 乌兰浩特市| 通城县| 温宿县| 绥芬河市| 江陵县| 临洮县| 玉门市| 元氏县| 仙游县| 山西省| 昌江| 文水县| 澜沧| 托里县|