国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【嵌入式Qt開發(fā)入門】Qt如何網(wǎng)絡(luò)編程——獲取本機(jī)的網(wǎng)絡(luò)信息

這篇具有很好參考價(jià)值的文章主要介紹了【嵌入式Qt開發(fā)入門】Qt如何網(wǎng)絡(luò)編程——獲取本機(jī)的網(wǎng)絡(luò)信息。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

????????Qt 網(wǎng)絡(luò)模塊為我們提供了編寫TCP/IP客戶端和服務(wù)器的類。它提供了較低級(jí)別的類,例如代表低級(jí)網(wǎng)絡(luò)概念的 QTcpSocket,QTcpServer 和 QUdpSocket,以及諸如 QNetworkRequest, QNetworkReply 和 QNetworkAccessManager 之類的高級(jí)類來執(zhí)行使用通用協(xié)議的網(wǎng)絡(luò)操作。它 還提供了諸如QNetworkConfiguration,QNetworkConfigurationManager和QNetworkSession等類, 實(shí)現(xiàn)承載管理。

????????想要在程序中使用 Qt 網(wǎng)絡(luò)模塊,我們需要在 pro 項(xiàng)目配置文件里增加下面的一條語句。

QT     += network

獲取本機(jī)的網(wǎng)絡(luò)信息

????????為什么先獲取本機(jī)網(wǎng)絡(luò)信息呢?在建立網(wǎng)絡(luò)通信之前我們至少得獲取對(duì)方的 IP 地址。在網(wǎng)絡(luò)應(yīng)用中,經(jīng)常需要用到本機(jī)的主機(jī)名、IP 地址、MAC 地址等網(wǎng)絡(luò)信息,通常通在 Windows 通過調(diào)出命令行 cmd 窗口輸入ipconfig或者在 Linux 系統(tǒng)中使用ifconfig命令就可以查看相關(guān)信息了,在這里我們利用Qt做出一個(gè)可以查詢的界面和功能出來,為了后面的網(wǎng)絡(luò)編程打下一個(gè)簡單的基礎(chǔ)。

????????Qt 提供了 QHostInfo 和 QNetworkInterface 類可以用于此類信息查詢。更多關(guān)于 QHostInfo 和 QNetworkInterface 的相關(guān)函數(shù)可以在 Qt 的幫助文檔中找到。下面我們寫代碼時(shí)會(huì)使用到相關(guān)的函數(shù),有清楚的注釋。

應(yīng)用實(shí)例

? ? ? ? 項(xiàng)目目的:了解如何通過QHostInfo和QNetworkInterface類獲取本地網(wǎng)絡(luò)所有接口的信息。

????????項(xiàng)目名稱:networkhostinfo ,獲取本機(jī)網(wǎng)絡(luò)接口信息。????????

????????獲取本機(jī)的網(wǎng)絡(luò)接口信息,打印在文本瀏覽框上,點(diǎn)擊按鈕可直接獲取,為了清楚看見是重新獲取的過程,本例點(diǎn)擊獲取本機(jī)信息按鈕后延時(shí) 1s 去刷新獲取的信息。點(diǎn)擊另一個(gè)清空文本信息按鈕可以清空文本瀏覽框上的文本內(nèi)容。

????????項(xiàng)目文件 networkhostinfo.pro 文件第一行添加的代碼部分如下。

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

????????在頭文件“mainwindow.h”具體代碼如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTimer>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    /* 點(diǎn)擊獲取和清空文本按鈕 */
    QPushButton *pushButton[2];

    /* 文本瀏覽框用于顯示本機(jī)的信息 */
    QTextBrowser *textBrowser;

    /* 水平Widget容器和垂直Widget容器*/
    QWidget *hWidget;
    QWidget *vWidget;

    /* 水平布局和垂直布局 */
    QHBoxLayout *hBoxLayout;
    QVBoxLayout *vBoxLayout;

    /* 定時(shí)器 */
    QTimer *timer;

    /* 獲取本機(jī)的網(wǎng)絡(luò)的信息,返回類型是QString */
    QString getHostInfo();

private slots:
    /* 定時(shí)器槽函數(shù),點(diǎn)擊按鈕后定時(shí)觸發(fā) */
    void timerTimeOut();

    /* 顯示本機(jī)信息 */
    void showHostInfo();

    /* 啟動(dòng)定時(shí)器 */
    void timerStart();

    /* 清空textBrowser的信息 */
    void clearHostInfo();
};
#endif // MAINWINDOW_H

????????頭文件里主要是聲明兩個(gè)按鈕和一個(gè)文本瀏覽框。另外還有一個(gè)定時(shí)器,聲明一些槽函數(shù), 比較簡單。 在源文件“mainwindow.cpp”具體代碼如下。

#include "mainwindow.h"
#include <QNetworkInterface>
#include <QHostInfo>
#include <QThread>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 設(shè)置位置與大小 */
    this->setGeometry(0, 0, 800, 480);

    /* 點(diǎn)擊獲取本地信息按鈕和清空文本按鈕 */
    pushButton[0] = new QPushButton();
    pushButton[1] = new QPushButton();

    pushButton[0]->setText("獲取本機(jī)信息");
    pushButton[1]->setText("清空文本信息");

    /* 按鈕的大小根據(jù)文本自適應(yīng),
     * 注意setSizePolicy需要在布局中使用 */
    pushButton[0]->setSizePolicy(QSizePolicy::Fixed,
                                 QSizePolicy::Fixed);
    pushButton[1]->setSizePolicy(QSizePolicy::Fixed,
                                 QSizePolicy::Fixed);

    /* 水平Widget和垂直Widget用于添加布局 */
    hWidget = new QWidget();
    vWidget = new QWidget();

    /* 水平布局和垂直布局 */
    hBoxLayout = new QHBoxLayout();
    vBoxLayout = new QVBoxLayout();

    /* 文本瀏覽框 */
    textBrowser = new QTextBrowser();

    /* 添加到水平布局 */
    hBoxLayout->addWidget(pushButton[0]);
    hBoxLayout->addWidget(pushButton[1]);

    /* 將水平布局設(shè)置為hWidget的布局 */
    hWidget->setLayout(hBoxLayout);

    /* 將文本瀏覽框和hWidget添加到垂直布局 */
    vBoxLayout->addWidget(textBrowser);
    vBoxLayout->addWidget(hWidget);

    /* 將垂直布局設(shè)置為vWidget的布局 */
    vWidget->setLayout(vBoxLayout);

    /* 設(shè)置vWidget為中心部件 */
    setCentralWidget(vWidget);

    /* 定時(shí)器初始化 */
    timer = new QTimer();

    /* 信號(hào)槽連接 */
    connect(pushButton[0], SIGNAL(clicked()),
            this, SLOT(timerStart()));
    connect(pushButton[1], SIGNAL(clicked()),
            this, SLOT(clearHostInfo()));
    connect(timer, SIGNAL(timeout()),
            this, SLOT(timerTimeOut()));
}

MainWindow::~MainWindow()
{
}

void MainWindow::timerStart()
{
    /* 清空文本 */
    textBrowser->clear();

    /* 定時(shí)1s */
    timer->start(1000);
}

void MainWindow::timerTimeOut()
{
    /* 顯示本機(jī)信息 */
    showHostInfo();

    /* 停止定時(shí)器 */
    timer->stop();
}

QString MainWindow::getHostInfo()
{
    /* 通過QHostInfo的localHostName函數(shù)獲取主機(jī)名稱 */
    QString str = "主機(jī)名稱:" + QHostInfo::localHostName() + "\n";

    /* 獲取所有的網(wǎng)絡(luò)接口,
     * QNetworkInterface類提供主機(jī)的IP地址和網(wǎng)絡(luò)接口的列表 */
    QList<QNetworkInterface> list
            = QNetworkInterface::allInterfaces();

    /* 遍歷list */
    foreach (QNetworkInterface interface, list) {
        str+= "網(wǎng)卡設(shè)備:" + interface.name() + "\n";
        str+= "MAC地址:" + interface.hardwareAddress() + "\n";

        /* QNetworkAddressEntry類存儲(chǔ)IP地址子網(wǎng)掩碼和廣播地址 */
        QList<QNetworkAddressEntry> entryList
                = interface.addressEntries();

        /* 遍歷entryList */
        foreach (QNetworkAddressEntry entry, entryList) {
            /* 過濾IPv6地址,只留下IPv4 */
            if (entry.ip().protocol() ==
                    QAbstractSocket::IPv4Protocol) {
                str+= "IP 地址:" + entry.ip().toString() + "\n";
                str+= "子網(wǎng)掩碼:" + entry.netmask().toString() + "\n";
                str+= "廣播地址:" + entry.broadcast().toString() + "\n\n";
            }
        }
    }

    /* 返回網(wǎng)絡(luò)信息 */
    return str;
}

void MainWindow::showHostInfo()
{
    /* 獲取本機(jī)信息后顯示到textBrowser */
    textBrowser->insertPlainText(getHostInfo());
}

void MainWindow::clearHostInfo()
{
    /* 判斷textBrowser是否為空,如果不為空則清空文本 */
    if (!textBrowser->toPlainText().isEmpty())

        /* 清空文本 */
        textBrowser->clear();
}

? ? ? ??首先,通過 QHostInfo 的 localHostName 函數(shù)獲取主機(jī)名稱。

? ? ? ? ?然后通過 QNetworkInterface::allInterfaces()獲取網(wǎng)絡(luò)接口列表 list 類存儲(chǔ) IP 地址子網(wǎng)掩碼和廣播地址。如果我們用 qDebug()函數(shù)打印出 list,可以發(fā)現(xiàn)獲取了所有的網(wǎng)絡(luò)信息。 而我們要提取網(wǎng)絡(luò)里面的網(wǎng)絡(luò)信息使用 QNetworkAddressEntry。

? ? ? ? 再用QNetworkAddressEntry 從 interface 接口里使用函數(shù) addressEntries(), 獲取所有的條目。就可以使用 QNetworkAddressEntry 的對(duì)象 entry 獲取 IP 地址子網(wǎng)掩碼和廣播地址。

????????因?yàn)楂@取的entries在一個(gè) QNetworkInterface下可能有兩個(gè)IP,分別是ipv4 和 ipv6。這里使用ip().protocol()來判斷協(xié)議的類型,只留下 ipv4 類型的信息。篩選信息在我們寫程序常常需要的。

程序運(yùn)行效果

????????點(diǎn)擊獲取本機(jī)信息,在文本瀏覽框內(nèi)就打印出本機(jī)的網(wǎng)絡(luò)信息(包括了主機(jī)名,網(wǎng)卡名, ip 地址等)。這里因?yàn)檫^濾掉了 IPv6 的信息。通常一個(gè)網(wǎng)卡有兩個(gè) ip 地址,一個(gè)是 ipv4,另一 個(gè)是 ipv6 的地址。下面的網(wǎng)卡設(shè)備 lo,是本地回環(huán)網(wǎng)卡。另一個(gè) ens33 是虛擬機(jī)的網(wǎng)卡,由 VMware 虛擬出來的。點(diǎn)擊清空文本信息會(huì)清空文本瀏覽框里的網(wǎng)絡(luò)信息。

?

【嵌入式Qt開發(fā)入門】Qt如何網(wǎng)絡(luò)編程——獲取本機(jī)的網(wǎng)絡(luò)信息,Linux,網(wǎng)絡(luò),Qt,qt,開發(fā)語言,網(wǎng)絡(luò),c++,linux文章來源地址http://www.zghlxwxcb.cn/news/detail-563526.html

到了這里,關(guān)于【嵌入式Qt開發(fā)入門】Qt如何網(wǎng)絡(luò)編程——獲取本機(jī)的網(wǎng)絡(luò)信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【嵌入式Qt開發(fā)入門】在Ubuntu下編寫C++

    【嵌入式Qt開發(fā)入門】在Ubuntu下編寫C++

    ????????在 Ubuntu 上面編寫 C++,本文內(nèi)容主要介紹在 Ubuntu 在終端窗口下使用 vi/vim 編輯一 個(gè) C++源文件。通過編寫最簡單的示例“Hello,World!”。帶領(lǐng)大家學(xué)習(xí)如何在 Ubuntu 終端下編輯和編譯 C++。這里要求大家會(huì)在 Ubuntu 上使用 vi/vim,也就是要求大家有一點(diǎn) Ubuntu 入門的基

    2024年02月11日
    瀏覽(22)
  • lv8 嵌入式開發(fā) 網(wǎng)絡(luò)編程開發(fā) 21 私有云盤項(xiàng)目

    lv8 嵌入式開發(fā) 網(wǎng)絡(luò)編程開發(fā) 21 私有云盤項(xiàng)目

    目錄 1云盤項(xiàng)目簡介 2 項(xiàng)目實(shí)現(xiàn) 2.1 首先實(shí)現(xiàn)TCP客戶端、服務(wù)端 2.2 實(shí)現(xiàn)客戶端函數(shù)簡化 2.3 實(shí)現(xiàn)服務(wù)端函數(shù)簡化 2.4 TCP數(shù)據(jù)連包現(xiàn)象 2.5 封裝send函數(shù)和recv函數(shù) 2.6 建立readme說明 2.7 實(shí)現(xiàn)文件傳輸 2.8 讀取配置文件種的ip、端口號(hào),通過argv[1]參數(shù)實(shí)現(xiàn)文件傳輸 3 最終項(xiàng)目? 常見的

    2024年02月08日
    瀏覽(21)
  • lv7 嵌入式開發(fā)-網(wǎng)絡(luò)編程開發(fā) 13 UNIX域套接字

    目錄 1 UNIX 域流式套接字 2 UNIX 域數(shù)據(jù)報(bào)套接字 UNIX 域流式套接字(UNIX domain stream socket)是一種在同一臺(tái)主機(jī)上的進(jìn)程之間進(jìn)行通信的機(jī)制。它不依賴于網(wǎng)絡(luò)協(xié)議棧,而是使用文件系統(tǒng)作為通信的基礎(chǔ)。 UNIX 域流式套接字提供可靠的、雙向的、面向連接的通信方式。與傳統(tǒng)的

    2024年02月07日
    瀏覽(21)
  • lv7 嵌入式開發(fā)-網(wǎng)絡(luò)編程開發(fā) 03 TCP/IP與五層體系結(jié)構(gòu)

    lv7 嵌入式開發(fā)-網(wǎng)絡(luò)編程開發(fā) 03 TCP/IP與五層體系結(jié)構(gòu)

    目錄 1 TCP/IP協(xié)議族體系結(jié)構(gòu) 1.1?OSI與TCP/IP 1.2?TCP/IP 的體系結(jié)構(gòu)? 1.3?TCP/IP 體系結(jié)構(gòu)的另一種表示方法 1.4?沙漏計(jì)時(shí)器形狀的 TCP/IP 協(xié)議族 2 五層協(xié)議的體系結(jié)構(gòu) 2.1 各層的主要功能? 2.2 互聯(lián)網(wǎng)中客戶-服務(wù)器工作方式 2.3?同時(shí)為多個(gè)客戶進(jìn)程提供服務(wù)? 3 練習(xí) 是事實(shí)上的國際標(biāo)

    2024年02月07日
    瀏覽(25)
  • 嵌入式開發(fā)板qt gdb調(diào)試

    嵌入式開發(fā)板qt gdb調(diào)試

    1) 啟動(dòng) gdbserver ssh 或者 telnet 登陸揚(yáng)創(chuàng)平板 192.168.0.253, 進(jìn)入命令行執(zhí)行如下: chmod 777 /home/HelloWorld (2) 打 開 QTcreator-Debug-StartDebugging-Attach to Running Debug Server 進(jìn)行如下設(shè)置,設(shè)置監(jiān)聽端口10000. 點(diǎn)擊上圖中的按鈕,由于按鈕中的函數(shù)設(shè)置了斷點(diǎn),則跳到斷點(diǎn),界面如下

    2024年02月04日
    瀏覽(34)
  • 嵌入式Qt 開發(fā)一個(gè)音樂播放器

    嵌入式Qt 開發(fā)一個(gè)音樂播放器

    上篇文章:RK3568源碼編譯與交叉編譯環(huán)境搭建,進(jìn)行了OK3568開發(fā)板軟件開發(fā)環(huán)境搭建,通過編譯RK3568的源碼,可以得到Qt開發(fā)的交叉編譯相關(guān)工具。 本篇,就來在搭建好的軟件開發(fā)中,進(jìn)行Qt軟件的開發(fā)測試。由于Qt是支持跨平臺(tái)的,因此本篇的音樂播放器,先在Windows上編寫

    2024年02月02日
    瀏覽(41)
  • 嵌入式Linux Qt5 (C++)開發(fā)欄目概述

    本欄目開始介紹Linux系統(tǒng)下的Qt C++程序開發(fā),資源是以嵌入式為切入點(diǎn)(現(xiàn)在Linux系統(tǒng)下的Qt C++程序開發(fā)好像就是應(yīng)用于嵌入式),那就跟著一起學(xué)習(xí) Linux系統(tǒng)下的Qt C++程序開發(fā)知識(shí) ,再擴(kuò)展一下 嵌入式 的知識(shí)吧。我這里默認(rèn)已經(jīng) 熟悉C++基本語法、熟悉Qt在windows下的使用方

    2024年02月12日
    瀏覽(23)
  • 嵌入式開發(fā)----示波器入門

    嵌入式開發(fā)----示波器入門

    對(duì)于嵌入式工程師來說,示波器的使用極為重要,他就像是“電子工程師的眼睛”,把被測信號(hào)的實(shí)際波形顯示在屏幕上,以供工程師查找定位問題或評(píng)估系統(tǒng)性能等,利用示波器能觀察各種不同信號(hào)幅度隨時(shí)間變化的波形曲線,還可以用來測試電量,如電壓、電流、頻率、

    2024年01月18日
    瀏覽(35)
  • 嵌入式Linux:如何進(jìn)行嵌入式Linux開發(fā)?

    目錄 1、裸機(jī)開發(fā) 2、SDK開發(fā) 3、驅(qū)動(dòng)開發(fā) 3.1、字符設(shè)備驅(qū)動(dòng) 3.2、塊設(shè)備驅(qū)動(dòng) 3.3、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng) 4、應(yīng)用開發(fā) 嵌入式Linux開發(fā)主要有四種方式:裸機(jī)開發(fā)、SDK開發(fā)、驅(qū)動(dòng)開發(fā)和應(yīng)用開發(fā)。 裸機(jī)開發(fā)通常指在沒有操作系統(tǒng)支持的環(huán)境中直接在硬件上運(yùn)行程序的開發(fā)。這種開發(fā)方

    2024年01月25日
    瀏覽(30)
  • 嵌入式開發(fā)--CubeMX使用入門教程

    嵌入式開發(fā)--CubeMX使用入門教程

    嵌入式開發(fā)–CubeMX使用入門教程 傳統(tǒng)的單片機(jī)開發(fā)時(shí),需要針對(duì)片上外設(shè)做各種初始化的工作,相當(dāng)麻煩。 CubeMX是ST公司出品的一款圖形化代碼生成工具,通過圖形化界面,可以非常直觀的配置好各種片上外設(shè),時(shí)鐘,中斷,DMA等等各種設(shè)備的參數(shù),然后CubeMX可以直接生成初

    2024年04月12日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包