• <tt id="fpcd6"><noscript id="fpcd6"></noscript></tt>

    <cite id="fpcd6"><noscript id="fpcd6"><delect id="fpcd6"></delect></noscript></cite>

      <rp id="fpcd6"></rp>
    1. 使用Qt獲取NTP服務器時間的方法及示例

      admin1年前 (2023-07-12)時頻百科361

        使用Qt獲取NTP服務器時間是一個實用的功能,這樣可以使得程序在使用時更加準確,下面將會對這個功能進行詳細的闡述。

        

      1、QNetworkDatagram的使用

      Qt提供了一個類QNetworkDatagram,用于在網絡上發送和接收數據報。我們可以通過它發送一個NTP協議的請求。這個請求是一個48字節的數據報,它的前48字節是0,第一個字節是17代表NTPv4,后面的字節里是一些控制信息。發送該數據報后,等待服務器返回48字節的應答即可得到服務器的時間信息。

      使用Qt獲取NTP服務器時間的方法及示例

        使用QNetworkDatagram類來實現發送和接收數據包的代碼如下:

        ```

        QByteArray requestData(48, 0);

        requestData[0] = 0x1b; // 設置NTP協議版本

        QNetworkDatagram datagram(requestData, QHostAddress("pool.ntp.org"), 123);

        QUdpSocket udpSocket;

        udpSocket.writeDatagram(datagram);

        if (udpSocket.waitForReadyRead(3000)) {

         QByteArray data;

         data.resize(udpSocket.pendingDatagramSize());

         udpSocket.readDatagram(data.data(), data.size());

         // 對獲取的數據字節進行時間計算處理

        } else {

         qDebug() << "Request timeout";

        ```

        在上述代碼中,我們通過QByteArray對象建立了一個長度為48、且所有位都是0的數組,然后通過這個數組以及QHostAddress類創建了一個QNetworkDatagram對象,并將其發送到指定的主機地址和端口。如果在指定時間內沒有收到來自服務器的應答,則認為該次請求超時。

        

      2、將時間戳轉化為人類可讀的時間

      獲取NTP服務器時間后,我們需要將時間戳轉化為人類可讀的時間。可以通過函數time_t ntohl(time_t netlong)將網絡字節序的32位無符號整數轉換為主機字節序的32位無符號整數。

        下面是將網絡字節序的64位時間戳轉換為人可讀的時間的代碼:

        ```

        QByteArray data; // 從服務器獲取的數據

        unsigned long long NTP_TIMESTAMP_DELTA = 2208988800ull; // 參考時間:1900年1月1日

        time_t high = ntohl(*((uint32_t*)&data[40])) - NTP_TIMESTAMP_DELTA;

        time_t low = ntohl(*((uint32_t*)&data[44]));

        time_t ntp_time = (high << 32) low;

        QDateTime utc(QDate(1900, 1, 1), QTime(0, 0, 0), Qt::UTC);

        QDateTime current(utc.addSecs(ntp_time));

        qDebug() << "Current time is" << current;

        ```

        在上述代碼中,我們首先將從服務器獲取的64位時間戳分別存儲在high和low變量中,然后將它們拼接成一個新的64位時間戳ntp_time。接著,我們根據參考時間以及加上ntp_time計算出QDateTime對象current表示當前時間。

        

      3、使用定時器獲取服務器時間

      我們可以使用Qt中的QTimer定時器類,并在定時器的槽函數中實現NTP協議的請求和計算NTP服務器時間的過程。

        下面的代碼演示了如何使用QTimer類來獲取NTP服務器時間:

        ```

        void MainWindow::startTimer()

         QTimer *timer = new QTimer(this);

         connect(timer, &QTimer::timeout, this, &MainWindow::onTimer);

         timer->start(1000); // 每隔1秒執行一次onTimer()

        void MainWindow::onTimer()

         QByteArray requestData(48, 0);

         requestData[0] = 0x1b;

         QNetworkDatagram datagram(requestData, QHostAddress("pool.ntp.org"), 123);

         QUdpSocket udpSocket;

         udpSocket.writeDatagram(datagram);

         if (udpSocket.waitForReadyRead(3000)) {

         QByteArray data;

         data.resize(udpSocket.pendingDatagramSize());

         udpSocket.readDatagram(data.data(), data.size());

         // 進行時間戳處理

         unsigned long long NTP_TIMESTAMP_DELTA = 2208988800ull;

         time_t high = ntohl(*((uint32_t*)&data[40])) - NTP_TIMESTAMP_DELTA;

         time_t low = ntohl(*((uint32_t*)&data[44]));

         time_t ntp_time = (high << 32) low;

         QDateTime utc(QDate(1900, 1, 1), QTime(0, 0, 0), Qt::UTC);

         QDateTime current(utc.addSecs(ntp_time));

         qDebug() << "Current time is" << current;

         } else {

         qDebug() << "Request timeout";

         }

        ```

        在上述代碼中,我們首先在startTimer()函數中創建了一個QTimer對象,并將它與onTimer()槽函數連接并定時啟動。在onTimer函數中,我們使用了前面提到的QNetworkDatagram類發送了一個NTP協議的請求,并通過時間戳計算得到了當前的時間,并打印到控制臺上。

        

      4、使用并發框架多線程并發地獲取服務器時間

      對于高并發和網絡阻塞等問題,我們可以使用Qt提供的QThreadPool類實現多線程并發獲取NTP服務器時間。

        下面的代碼展示了如何使用QThreadPool和QRunnable類來實現多線程并發獲取NTP服務器時間:

        ```

        class TimeRunnable : public QRunnable

        public:

         TimeRunnable(const QString &server) : _server(server) {}

         void run() override {

         QByteArray requestData(48, 0);

         requestData[0] = 0x1b;

         QNetworkDatagram datagram(requestData, QHostAddress(_server), 123);

         QUdpSocket udpSocket;

         udpSocket.writeDatagram(datagram);

         if (udpSocket.waitForReadyRead(3000)) {

         QByteArray data;

         data.resize(udpSocket.pendingDatagramSize());

         udpSocket.readDatagram(data.data(), data.size());

         // 進行時間戳處理

         unsigned long long NTP_TIMESTAMP_DELTA = 2208988800ull;

         time_t high = ntohl(*((uint32_t*)&data[40])) - NTP_TIMESTAMP_DELTA;

         time_t low = ntohl(*((uint32_t*)&data[44]));

         time_t ntp_time = (high << 32) low;

         QDateTime utc(QDate(1900, 1, 1), QTime(0, 0, 0), Qt::UTC);

         QDateTime current(utc.addSecs(ntp_time));

         emit currentTime(current);

         }

         }

        signals:

         void currentTime(const QDateTime &);

        };

        class MainWindow : public QMainWindow

         Q_OBJECT

        public:

         MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {

         _pool.setMaxThreadCount(10); // 設置線程池最大線程數

         }

         ~MainWindow() {}

        public slots:

         void onTime(const QDateTime ¤t) {

         qDebug() << "Current time is" << current;

         }

         void onStart() {

         for (const auto &server : _servers) {

         TimeRunnable *runnable = new TimeRunnable(server);

         connect(runnable, &TimeRunnable::currentTime, this, &MainWindow::onTime);

         _pool.start(runnable);

         }

         }

        private:

         QVector _servers{"pool.ntp.org", "cn.ntp.org.cn", "time.windows.com"};

         QThreadPool _pool;

        };

        ```

        在上述代碼中,我們創建了一個名為TimeRunnable的類,其中包含發送和接收NTP請求的代碼,并通過signals和slots機制與MainWindow類連接。在MainWindow類中,我們首先創建了一個QThreadPool對象,并在onStart()槽函數中,用服務器名字自動運行TimeRunnable的實例,并將currentTime信號與onTime槽函數連接,以便在收到服務器時間時輸出到控制臺上。

        經過上述改進,我們可以同時對多個NTP服務器進行請求,增加了代碼的魯棒性并加快了時間獲取速度。

        總結:

        使用Qt獲取NTP服務器時間是一個強大的功能,可以在許多實際應用中發揮重要作用。在本文中我們提到了4個方法:使用QNetworkDatagram發送和接收請求、將時間戳轉化為人類可讀的時間、使用定時器獲取時間和使用并發框架獲取NTP服務器時間等。這些方法體現了Qt在網絡操作方面的強大實力,同時也為我們在實際應用中更好地使用Qt提供了不少思路。

        感謝您的閱讀,希望這篇文章能夠對您有所幫助!

      標簽: 時頻百科

      相關文章

      H3C服務器時間配置命令詳解

      H3C服務器時間配置命令詳解

        本文將圍繞H3C服務器時間配置命令為中心,從多個方面詳細闡述該命令的相關內容,包括設置時間、同步時間、備份和恢復時間以及常見問題解決等,幫助讀者更深入了解在運維管理中常用的H3C服務器時間配置命令。    1、設置時間 H3C服務器的時間設置非常重要,可以確保服務器上的應用程序、網絡服務運行得更加順暢。以下是設置時間的詳細步驟:   第一步,通過命令行或Web界面進入H3C服務器的...

      Centos配置時間服務器同步的實現方法

      Centos配置時間服務器同步的實現方法

        Centos配置時間服務器同步是一個重要的工作,它有助于確保服務器上的時間與整個網絡的時間保持一致。本文將從四個方面對Centos配置時間服務器同步的實現方法進行詳細闡述,包括安裝和配置NTP服務、配置防火墻、配置NTP客戶端和測試同步。通過本文的闡述,將幫助讀者掌握Centos配置時間服務器同步的實現方法。    1、安裝和配置NTP服務 要配置NTP服務器,首先需要安裝ntp軟件包。 centos服務器可以使用yum包...

      DCS服務器故障退出時間規定的制定與實施

      DCS服務器故障退出時間規定的制定與實施

        DCS服務器故障退出時間規定的制定與實施   全文概括:   DCS服務器是現代化工廠過程控制系統的核心,其退出時間的規定與實施直接影響著生產線的正常運行。本文將從DCS服務器故障退出時間規定的制定、制定的必要性、實施過程以及后續效果四個方面進行詳細闡述,并對全文進行總結歸納。   1、制定DCS服務器故障退出時間規定的必要性   DCS服務器是現代化工廠的關鍵設備之一,它的故障退出時間對生產線的正常運行至關...

      CentOS服務器時間查看方法匯總

      CentOS服務器時間查看方法匯總

        CentOS是一款常見的Linux操作系統,作為服務器系統,時間顯示準確性非常重要。本文將對CentOS服務器時間查看方法進行匯總介紹,包括查看當前系統時間、查看時區、修改系統時區、同步網絡時間等方面。    1、查看當前系統時間 系統時間是指計算機內部保存的時間和日期。在CentOS系統中,可以通過使用date命令來查看當前系統時間。打開終端并輸入以下命令:   date...

      Linux服務器工作時間監控系統

      Linux服務器工作時間監控系統

        本文主要介紹Linux服務器工作時間監控系統。該系統可以幫助管理員實時監控服務器的工作時間,并且能夠生成詳細的報告,便于管理員對服務器進行管理和維護。本文將分為四個方面來介紹這個系統,分別是:系統原理、系統架構、系統應用以及系統優勢。    1、系統原理 Linux服務器工作時間監控系統主要通過監控服務器的各種資源使用情況來統計服務器的工作時間,包括CPU使用情況、內存使用情況、網絡帶寬使用情況等等。同時,該系統還可以通過...

      Linux下更改時間服務器方法及注意事項

      Linux下更改時間服務器方法及注意事項

        Linux下更改時間服務器是服務器管理的一個基本命令,確保服務器時間的準確性和一致性對于系統的正常運行至關重要。本文將從四個方面詳細闡述Linux下更改時間服務器方法及注意事項,包括如何配置時間服務器、時區設置方法、硬件時鐘同步、以及注意事項。    1、配置時間服務器 在Linux系統中,ntpd服務可以作為時間服務器。首先需要安裝ntp軟件包,并在ntp.conf文件中指定至少一個可靠的時間服務器。對于內部網絡,最好使...

      FF14服務器時間解析及應用指南

      FF14服務器時間解析及應用指南

        FF14游戲是目前全球玩家熱衷的MMORPG游戲之一,而服務器時間作為游戲的基礎設定,對于游戲角色的成長和任務完成都有著重要的作用。本文將圍繞FF14服務器時間解析及應用指南展開講解,從不同方面詳細闡述服務器時間的功能和應用,為廣大玩家提供實用的指南和幫助。    1、服務器時間的基礎知識 FF14的服務器時間基于日本標準時間,即UTC+9。游戲內的時間和現實世界的時間是一一對應的,游戲中天亮和天黑、白天和黑夜的時間與現實...

      Linux服務器時間配置詳解

      Linux服務器時間配置詳解

           本文將對Linux服務器時間配置進行詳細的解析。Linux服務器時間配置是系統中重要的一部分,它直接影響到整個系統的時間,因此要做好時間配置,是保證系統穩定運行的關鍵。    1、時間同步 時間同步是指將不同設備的時間同步。因為每個設備的時間是不...

      DNF聯機大幅縮短等你來實測!

      DNF聯機大幅縮短等你來實測!

        DNF聯機大幅縮短等你來實測!這次的更新,讓很多DNF玩家都興奮不已。游戲平臺在這次更新中,很明顯地優化了聯機方面的表現,使得游戲體驗更加順暢,更加流暢。這篇文章,我們將從四個方面詳細論述DNF聯機大幅縮短等你來實測的具體情況。    1、服務器性能優化 在DNF聯機大幅縮短等你來實測中,游戲平臺通過優化服務器性能,使得游戲聯機速度得到了大幅提升。從技術角度來講,平臺通過增加服務器的處理能力,優化數據傳輸協議等方式,減少了...

      Linux服務器以BIOS時間為中心的查詢方法

      Linux服務器以BIOS時間為中心的查詢方法

        本文旨在詳細介紹Linux服務器以BIOS時間為中心的查詢方法。Linux服務器在進行系統維護和日志審計時,常常需要根據時間來查詢,而BIOS時間是一個重要的時間參考。因此,熟練掌握Linux服務器以BIOS時間為中心的查詢方法對于系統管理員和安全工程師來說都是非常重要的。    1、查看BIOS時間 查看BIOS時間可以通過命令hwclock來實現。這個命令用于顯示或更改硬件時鐘(RTC,Real Time Clock)...

      Linux服務器時間同步方法簡介

      Linux服務器時間同步方法簡介

        本文將詳細介紹Linux服務器時間同步方法,包括4個方面的內容:NTP時間同步、手動設置日期時間、定時同步時間以及時區設置。先介紹NTP時間同步,并與其他同步方法做對比分析。然后,介紹手動設置日期時間,包括常用的date命令及其參數的使用方法。接著,講解如何定時同步時間,包括crontab命令及其用法。最后,介紹如何設置時區,包括查看當前時區和設置不同時區的方法。    1、NTP時間同步 NTP(Network Time...

      《戰火連天,傾城出擊》——一戰傾城什么時間開服啟新篇章!

      《戰火連天,傾城出擊》——一戰傾城什么時間開服啟新篇章!

        本文將為大家詳細介紹《戰火連天,傾城出擊》——一戰傾城什么時間開服啟新篇章。這是一款以第一次世界大戰為背景的多人在線戰爭游戲,該游戲自發布之日起便備受關注,尤其是在游戲內增加更多功能和新流程之后,如今更是備受玩家們的熱捧和期待。在本文中,我們將從四個方面分別詳細闡述這款游戲將在什么時間啟動新篇章。    1、游戲版本更新時間 《戰火連天,傾城出擊》自發布之后,一直積極更新,加入了更多的游戲流程、劇情故事和升級功能。這些更新...

      DHCP時間服務器軟件下載推薦

      DHCP時間服務器軟件下載推薦

        DHCP時間服務器軟件下載推薦——解決網絡時間同步問題的優秀方案   在計算機網絡中,時間同步是非常重要的一個問題,它不僅涉及到數據安全和系統穩定等方面,還跨越了多個領域的應用。而DHCP時間服務器軟件,就是一個非常優秀的解決方案。本文將從軟件的功能、性能、穩定性和易用性四個方面進行闡述,為大家詳細介紹DHCP時間服務器軟件下載的推薦。    1、軟件功能 DHCP時間服務器軟件可以生成NTP時間協議,支...

      3D坦克服務器維護全流程:時長分析與優化策略

      3D坦克服務器維護全流程:時長分析與優化策略

        本文將從以下四個方面對"3D坦克服務器維護全流程:時長分析與優化策略"進行詳細的闡述。    1、3D坦克服務器維護全流程分析 在3D坦克服務器維護全流程分析中,我們需要對維護過程進行全面的分析,建立流程模型,確定流程節點及其順序,識別流程中存在的瓶頸點和關鍵節點。通過對各個流程節點的分析,可以有效地降低維護時間成本,提高維護效率。   首先,我們需要進行過程建...

      MySQL修改服務器時間為北京時間

      MySQL修改服務器時間為北京時間

        MySQL是目前全球最流行的關系型數據庫管理系統之一,也是家喻戶曉,眾所周知的數據庫軟件。其中一個非常實用的功能就是修改服務器時間為北京時間。針對大家的需求,本文從4個方面進行詳細的闡述,幫助大家快速方便地修改MySQL服務器時間為北京時間。    1、檢查服務器原先的時間設置 在開始修改的過程中,首先需要確定當前服務器的時間設置是否正確。通常情況下,服務器的時間設置是GMT標準時間而非北京時間。在這種情況下,我們必須手動...

      大香区一二三四区2021