RM新时代官网网址|首入球时间

  1. <dfn id="z1muo"></dfn>

    <menuitem id="z1muo"><menuitem id="z1muo"></menuitem></menuitem>

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

    admin3年前 (2023-07-12)時頻百科1255

      使用Qt獲取NTP服務(wù)器時間是一個實(shí)用的功能,這樣可以使得程序在使用時更加準(zhǔn)確,下面將會對這個功能進(jìn)行詳細(xì)的闡述。

      

    1、QNetworkDatagram的使用

    Qt提供了一個類QNetworkDatagram,用于在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)報(bào)。我們可以通過它發(fā)送一個NTP協(xié)議的請求。這個請求是一個48字節(jié)的數(shù)據(jù)報(bào),它的前48字節(jié)是0,第一個字節(jié)是17代表NTPv4,后面的字節(jié)里是一些控制信息。發(fā)送該數(shù)據(jù)報(bào)后,等待服務(wù)器返回48字節(jié)的應(yīng)答即可得到服務(wù)器的時間信息。

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

      使用QNetworkDatagram類來實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)包的代碼如下:

      ```

      QByteArray requestData(48, 0);

      requestData[0] = 0x1b; // 設(shè)置NTP協(xié)議版本

      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());

       // 對獲取的數(shù)據(jù)字節(jié)進(jìn)行時間計(jì)算處理

      } else {

       qDebug() << "Request timeout";

      ```

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

      

    2、將時間戳轉(zhuǎn)化為人類可讀的時間

    獲取NTP服務(wù)器時間后,我們需要將時間戳轉(zhuǎn)化為人類可讀的時間??梢酝ㄟ^函數(shù)time_t ntohl(time_t netlong)將網(wǎng)絡(luò)字節(jié)序的32位無符號整數(shù)轉(zhuǎn)換為主機(jī)字節(jié)序的32位無符號整數(shù)。

      下面是將網(wǎng)絡(luò)字節(jié)序的64位時間戳轉(zhuǎn)換為人可讀的時間的代碼:

      ```

      QByteArray data; // 從服務(wù)器獲取的數(shù)據(jù)

      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;

      ```

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

      

    3、使用定時器獲取服務(wù)器時間

    我們可以使用Qt中的QTimer定時器類,并在定時器的槽函數(shù)中實(shí)現(xiàn)NTP協(xié)議的請求和計(jì)算NTP服務(wù)器時間的過程。

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

      ```

      void MainWindow::startTimer()

       QTimer *timer = new QTimer(this);

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

       timer->start(1000); // 每隔1秒執(zhí)行一次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());

       // 進(jìn)行時間戳處理

       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()函數(shù)中創(chuàng)建了一個QTimer對象,并將它與onTimer()槽函數(shù)連接并定時啟動。在onTimer函數(shù)中,我們使用了前面提到的QNetworkDatagram類發(fā)送了一個NTP協(xié)議的請求,并通過時間戳計(jì)算得到了當(dāng)前的時間,并打印到控制臺上。

      

    4、使用并發(fā)框架多線程并發(fā)地獲取服務(wù)器時間

    對于高并發(fā)和網(wǎng)絡(luò)阻塞等問題,我們可以使用Qt提供的QThreadPool類實(shí)現(xiàn)多線程并發(fā)獲取NTP服務(wù)器時間。

      下面的代碼展示了如何使用QThreadPool和QRunnable類來實(shí)現(xiàn)多線程并發(fā)獲取NTP服務(wù)器時間:

      ```

      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());

       // 進(jìn)行時間戳處理

       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); // 設(shè)置線程池最大線程數(shù)

       }

       ~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;

      };

      ```

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

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

      總結(jié):

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

      感謝您的閱讀,希望這篇文章能夠?qū)δ兴鶐椭?

    標(biāo)簽: 時頻百科

    相關(guān)文章

    DayZ自搭服務(wù)器如何設(shè)置為中心時間?

    DayZ自搭服務(wù)器如何設(shè)置為中心時間?

      DayZ是一款極具特色的生存游戲,玩家們可以選擇建立自己的服務(wù)器,享受更多的游戲樂趣。然而,在進(jìn)行游戲過程中,時區(qū)的問題會導(dǎo)致一些不便利。因此,如何設(shè)置服務(wù)器為中心時間,成為了很多玩家困擾的問題。本文將詳細(xì)闡述DayZ自搭服務(wù)器如何設(shè)置為中心時間的方法和步驟。    1、修改服務(wù)器配置文件 首先,我們需要編輯服務(wù)器的配置文件,來設(shè)置服務(wù)器的時間。打開服務(wù)器的.cfg文件,找到下列代碼:...

    《時光倒流,逆水寒開啟全新篇章》

    《時光倒流,逆水寒開啟全新篇章》

      近年來隨著游戲的發(fā)展,各種玩法和游戲類型不斷涌現(xiàn),久而久之,許多玩家都開始感覺游戲的新鮮感和樂趣逐漸消失,但是今年的《時光倒流,逆水寒開啟全新篇章》卻讓人眼前一亮。作為新型畫面游戲,該游戲切換到全新畫風(fēng),并增加了許多嶄新的玩法,為廣大玩家?guī)聿灰粯拥挠螒蝮w驗(yàn)。    1、新畫風(fēng)新玩法 與原版逆水寒相比,新版本的畫風(fēng)更加唯美細(xì)膩,建筑、角色、道具等都做了巨大的改進(jìn),讓人置身于游戲之中,仿佛身臨其境。而相較于原版,新版的玩法更...

    FF14服務(wù)器時間查詢方法及注意事項(xiàng)

    FF14服務(wù)器時間查詢方法及注意事項(xiàng)

      本文主要介紹FF14服務(wù)器時間查詢方法及注意事項(xiàng)。FF14是一款大型多人在線角色扮演游戲,玩家在游戲中需要根據(jù)服務(wù)器時間來安排游戲任務(wù),因此了解如何查詢服務(wù)器時間及注意事項(xiàng)是十分重要的。    1、FF14服務(wù)器時間查詢方法 在FF14游戲中,查詢服務(wù)器時間十分簡單。只需要按下“Tab”鍵,然后在聊天框中輸入“/ptime”就可以了。系統(tǒng)會返回當(dāng)前服務(wù)器時間。需要注意的是,由于不同的服務(wù)器位于不同的時區(qū),因此需要先確認(rèn)自己...

    Linux服務(wù)器時間切換方法詳解

    Linux服務(wù)器時間切換方法詳解

      Linux服務(wù)器時間切換方法是Linux系統(tǒng)中非常重要的一個方面。在Linux服務(wù)器的日常運(yùn)維中,時間同步一直都是一個比較麻煩的問題。由于Linux存在時鐘漂移現(xiàn)象等特點(diǎn),這也就意味著我們不能夠完全依賴于硬件時鐘,需要我們經(jīng)常性的進(jìn)行時間同步操作,為了保證系統(tǒng)時間的準(zhǔn)確性。因此,本文將對Linux服務(wù)器時間切換方法進(jìn)行詳細(xì)闡述,涵蓋了NTP時間同步、手動修改系統(tǒng)時間等方面,方便讀者學(xué)習(xí)理解。    1、NTP時間同步 NT...

    Linux下更改時間服務(wù)器方法及注意事項(xiàng)

    Linux下更改時間服務(wù)器方法及注意事項(xiàng)

      Linux下更改時間服務(wù)器是服務(wù)器管理的一個基本命令,確保服務(wù)器時間的準(zhǔn)確性和一致性對于系統(tǒng)的正常運(yùn)行至關(guān)重要。本文將從四個方面詳細(xì)闡述Linux下更改時間服務(wù)器方法及注意事項(xiàng),包括如何配置時間服務(wù)器、時區(qū)設(shè)置方法、硬件時鐘同步、以及注意事項(xiàng)。    1、配置時間服務(wù)器 在Linux系統(tǒng)中,ntpd服務(wù)可以作為時間服務(wù)器。首先需要安裝ntp軟件包,并在ntp.conf文件中指定至少一個可靠的時間服務(wù)器。對于內(nèi)部網(wǎng)絡(luò),最好使...

    iOS中實(shí)現(xiàn)獲取遠(yuǎn)程服務(wù)器時間作為應(yīng)用時間中心

    iOS中實(shí)現(xiàn)獲取遠(yuǎn)程服務(wù)器時間作為應(yīng)用時間中心

      本篇文章將介紹如何在iOS應(yīng)用中實(shí)現(xiàn)獲取遠(yuǎn)程服務(wù)器時間作為應(yīng)用時間中心。在移動應(yīng)用中,時間對于很多功能的實(shí)現(xiàn)都非常重要,而由于手機(jī)的本地時間可能會被用戶調(diào)整甚至被篡改,因此獲取遠(yuǎn)程服務(wù)器時間作為應(yīng)用時間中心可以避免很多時間相關(guān)的問題。下面我們將從四個方面對iOS中實(shí)現(xiàn)獲取遠(yuǎn)程服務(wù)器時間作為應(yīng)用時間中心做詳細(xì)的闡述。    1、獲取服務(wù)器時間 在 iOS 中獲取服務(wù)器時間需要通過網(wǎng)絡(luò)請求來實(shí)現(xiàn)。我們需要獲取一個可靠的時間服務(wù)...

    JavaScript客戶端和服務(wù)器時間戳不一致,如何解決?

    JavaScript客戶端和服務(wù)器時間戳不一致,如何解決?

      JavaScript是一種用于編程的高級語言,可用于在客戶端和服務(wù)器端執(zhí)行腳本。但是,當(dāng)在這兩個環(huán)境中處理時間時,存在JavaScript客戶端和服務(wù)器時間戳不一致的問題。這個問題可能會導(dǎo)致很多問題,如數(shù)據(jù)不同步、計(jì)算錯誤等。因此,在本文中,我們將從四個方面闡述JavaScript客戶端和服務(wù)器時間戳不一致的問題,以及如何解決這些問題。    1、時間戳的概念 在JavaScript中,時間戳是指自1970年1月1日0時0...

    Linux服務(wù)器停機(jī)維護(hù)的時間安排和步驟詳解

    Linux服務(wù)器停機(jī)維護(hù)的時間安排和步驟詳解

      本文將詳細(xì)闡述Linux服務(wù)器停機(jī)維護(hù)的時間安排和步驟,首先介紹為什么需要進(jìn)行服務(wù)器維護(hù)與停機(jī),其次介紹停機(jī)維護(hù)時間的安排與步驟,然后分別從備份數(shù)據(jù)、升級系統(tǒng)、更新軟件和硬件維護(hù)四個方面進(jìn)行詳細(xì)的闡述,最后總結(jié)歸納。    1、為什么要進(jìn)行服務(wù)器維護(hù)與停機(jī) 作為一臺持續(xù)運(yùn)行的服務(wù)器,會不可避免地存在各種問題,并且配置、應(yīng)用程序、操作系統(tǒng)等也會隨著時間流逝而發(fā)生變化。因此,定期對服務(wù)器進(jìn)行維護(hù)和停機(jī)是保證服務(wù)器正常運(yùn)行的關(guān)鍵...

    C語言實(shí)現(xiàn)客戶端與服務(wù)器時間自動同步差異

    C語言實(shí)現(xiàn)客戶端與服務(wù)器時間自動同步差異

      這篇3000字的文章將圍繞C語言實(shí)現(xiàn)客戶端與服務(wù)器時間自動同步差異,從四個方面進(jìn)行詳細(xì)闡述,分別是時間同步的意義、時間同步的基本原理、C語言實(shí)現(xiàn)時間同步的方式、時間同步后的效果。    1、時間同步的意義 在計(jì)算機(jī)網(wǎng)絡(luò)中,時間同步是一個非常重要的問題。如果網(wǎng)絡(luò)中的各個節(jié)點(diǎn)時間相差太大,就會造成諸如數(shù)據(jù)包混淆、消息延遲等方面的問題,嚴(yán)重影響網(wǎng)絡(luò)的正常運(yùn)行。因此,實(shí)現(xiàn)網(wǎng)絡(luò)中各個節(jié)點(diǎn)時間同步是非常必要的。...

    《大話西游時間服哪個服務(wù)器最合適?推薦來自游戲達(dá)人的建議》

    《大話西游時間服哪個服務(wù)器最合適?推薦來自游戲達(dá)人的建議》

      《大話西游》是一款備受玩家喜愛的網(wǎng)絡(luò)游戲,而選擇合適的服務(wù)器更是玩家游戲體驗(yàn)的重要因素之一。然而,對于沒有太多游戲經(jīng)驗(yàn)的玩家來說,選服務(wù)器很可能會遇到困難。因此,本文將由游戲達(dá)人的角度,從四個方面詳細(xì)分析《大話西游》時間服哪個服務(wù)器最合適,以推薦給廣大玩家。    1、服務(wù)器穩(wěn)定性 首先,服務(wù)器穩(wěn)定性是選擇服務(wù)器的重要因素。一個穩(wěn)定的服務(wù)器意味著玩家可以享受到更加順暢的游戲體驗(yàn),不會出現(xiàn)卡頓和掉線的情況。...

    CentOS集群時間同步配置指南

    CentOS集群時間同步配置指南

      在CentOS集群時間同步配置方面,為了保持集群節(jié)點(diǎn)之間系統(tǒng)的時間一致性,需要進(jìn)行時間同步。本文將從以下幾個方面對CentOS集群時間同步配置指南進(jìn)行詳細(xì)闡述:    1、配置NTP服務(wù) 配置NTP服務(wù)是實(shí)現(xiàn)時間同步的關(guān)鍵。在CentOS 7中,可以使用Chrony或NTPd服務(wù)進(jìn)行時間同步。可以通過以下命令安裝Chrony:   yum install chrony...

    Linux服務(wù)器密碼過期時間設(shè)置指南

    Linux服務(wù)器密碼過期時間設(shè)置指南

      本文主要針對Linux服務(wù)器密碼過期時間設(shè)置進(jìn)行詳細(xì)闡述,全文分為四個部分,分別從以下四個方面介紹密碼過期時間設(shè)置。    1、密碼過期時間設(shè)置 密碼過期時間是指用戶密碼過期失效的時間,一般情況下,系統(tǒng)管理員會為用戶設(shè)置密碼過期時間,這樣可以保證安全性,及時更換密碼。在Linux系統(tǒng)中,可以通過修改/etc/login.defs文件中的PASS_MAX_DAYS和PASS_MIN_DAYS參數(shù)來設(shè)置密碼過期時間。...

    Linux服務(wù)器頻繁失聯(lián)的解決方案

    Linux服務(wù)器頻繁失聯(lián)的解決方案

      本文旨在探討Linux服務(wù)器頻繁失聯(lián)的問題,并提供多種解決方案。文章將從網(wǎng)絡(luò)設(shè)置、硬件故障、軟件問題以及運(yùn)維維護(hù)四個方面進(jìn)行詳細(xì)闡述,幫助用戶更好地解決Linux服務(wù)器頻繁失聯(lián)的問題。    1、網(wǎng)絡(luò)設(shè)置 網(wǎng)絡(luò)設(shè)置是Linux服務(wù)器頻繁失聯(lián)的主要原因之一。如果服務(wù)器的網(wǎng)絡(luò)設(shè)置不正確或存在故障,則會導(dǎo)致服務(wù)器經(jīng)常斷線。以下是幾種常見的網(wǎng)絡(luò)設(shè)置問題及其解決方案:   1.1 防火墻設(shè)置...

    DNS服務(wù)器緩存時間對網(wǎng)站訪問速度的影響及優(yōu)化策略

    DNS服務(wù)器緩存時間對網(wǎng)站訪問速度的影響及優(yōu)化策略

      隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站的訪問速度已經(jīng)成為了用戶體驗(yàn)的重要指標(biāo)之一。DNS服務(wù)器緩存時間作為影響網(wǎng)站訪問速度的一個因素,需要被重視和優(yōu)化。    1、DNS服務(wù)器緩存時間的概念與作用 DNS(Domain Name System)域名系統(tǒng),它的作用是將人類可識別的域名轉(zhuǎn)化為機(jī)器可識別的IP地址,從而方便用戶訪問網(wǎng)站。當(dāng)用戶訪問某個網(wǎng)站時,首先會向DNS服務(wù)器發(fā)起域名解析請求,DNS服務(wù)器返回對應(yīng)的IP地址。由于DNS服務(wù)器緩...

    IBM服務(wù)器時間頻繁變動?解決方案請看這里!

    IBM服務(wù)器時間頻繁變動?解決方案請看這里!

      IBM服務(wù)器時間頻繁變動是許多企業(yè)中經(jīng)常會出現(xiàn)的問題之一。這個問題不僅會影響到企業(yè)的正常運(yùn)行,而且還會帶來各種問題和麻煩。然而,有很多解決方案可以幫助企業(yè)解決這個問題。本文將從四個方面闡述IBM服務(wù)器時間頻繁變動的問題以及解決方案。    1、硬件問題 IBM服務(wù)器時間頻繁變動的一個常見原因是硬件問題。例如,如果BIOS電池退化,服務(wù)器將無法保存正確的時間。另外,如果服務(wù)器使用的是老舊的硬件,也可能會出現(xiàn)時間錯誤的問題。為...

    RM新时代官网网址|首入球时间
    1. <dfn id="z1muo"></dfn>

      <menuitem id="z1muo"><menuitem id="z1muo"></menuitem></menuitem>

      1. <dfn id="z1muo"></dfn>

        <menuitem id="z1muo"><menuitem id="z1muo"></menuitem></menuitem>

        rm资金盘 rm新时代平台靠谱吗 RM新时代网站 RM新时代投资官网|首入球时间 rm新时代靠谱的平台