日本大片久久久高清免费看-日本大片免a费观看在线-日本大片免费一级-日本岛国片在线观看-日本道在线视频-日本叼嘿

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

admin2年前 (2023-07-12)時頻百科598

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

  

1、QNetworkDatagram的使用

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

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

  使用QNetworkDatagram類來實現(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é)進行時間計算處理

  } else {

   qDebug() << "Request timeout";

  ```

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

  

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

獲取NTP服務(wù)器時間后,我們需要將時間戳轉(zhuǎn)化為人類可讀的時間。可以通過函數(shù)time_t ntohl(time_t netlong)將網(wǎng)絡(luò)字節(jié)序的32位無符號整數(shù)轉(zhuǎn)換為主機字節(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計算出QDateTime對象current表示當(dāng)前時間。

  

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

我們可以使用Qt中的QTimer定時器類,并在定時器的槽函數(shù)中實現(xiàn)NTP協(xié)議的請求和計算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());

   // 進行時間戳處理

   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é)議的請求,并通過時間戳計算得到了當(dāng)前的時間,并打印到控制臺上。

  

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

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

  下面的代碼展示了如何使用QThreadPool和QRunnable類來實現(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());

   // 進行時間戳處理

   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機制與MainWindow類連接。在MainWindow類中,我們首先創(chuàng)建了一個QThreadPool對象,并在onStart()槽函數(shù)中,用服務(wù)器名字自動運行TimeRunnable的實例,并將currentTime信號與onTime槽函數(shù)連接,以便在收到服務(wù)器時間時輸出到控制臺上。

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

  總結(jié):

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

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

標簽: 時頻百科

相關(guān)文章

Moba游戲時間如何影響服務(wù)器運算

Moba游戲時間如何影響服務(wù)器運算

  本文將探討"Moba游戲時間如何影響服務(wù)器運算"這一話題。在電子競技行業(yè)中,Moba系列游戲一直占據(jù)著重要的地位。然而,隨著游戲時間的增長,Moba游戲的服務(wù)器運算將會受到怎樣的影響呢?本文將從四個方面闡述這一問題。    1、游戲數(shù)據(jù)的收集和傳輸 第一個方面是游戲數(shù)據(jù)的收集和傳輸。在Moba游戲中,玩家的每一個操作都會被記錄在服務(wù)器上。隨著游戲時間的增長,玩家操作產(chǎn)生的數(shù)據(jù)也隨之增多。大量數(shù)據(jù)的傳輸需...

Android應(yīng)用開發(fā)中服務(wù)器連接時間設(shè)置方案

Android應(yīng)用開發(fā)中服務(wù)器連接時間設(shè)置方案

  Android應(yīng)用開發(fā)是目前移動應(yīng)用開發(fā)的主流之一,其中和服務(wù)器的連接是非常重要的一環(huán)。而針對服務(wù)器連接時間的設(shè)置方案,也就顯得至關(guān)重要。本文將從四個方面,詳細闡述Android應(yīng)用開發(fā)中服務(wù)器連接時間設(shè)置方案。    1、連接超時時間的設(shè)定 在Android應(yīng)用中,網(wǎng)絡(luò)請求的超時時間是必須要考慮的因素之一。如果超時時間設(shè)置太短,可能會導(dǎo)致網(wǎng)絡(luò)請求無法完成,用戶體驗感降低。而如果超時時間設(shè)置太長,會導(dǎo)致界面假死,進而影響用...

ABAP代碼實現(xiàn)獲取服務(wù)器時間并格式化展示

ABAP代碼實現(xiàn)獲取服務(wù)器時間并格式化展示

  在現(xiàn)代企業(yè)信息化環(huán)境下,獲取服務(wù)器的時間并格式化展示是一個非常基礎(chǔ)的需求。本文將通過ABAP代碼實現(xiàn)獲取服務(wù)器時間并格式化展示為中心,對該需求進行詳細闡述。具體來說,本文將主要從以下四個方面入手:1、獲取服務(wù)器時間;2、時間格式化;3、時間的展示;4、實現(xiàn)代碼。通過對這四個方面的詳細闡述,讀者將能夠全面掌握ABAP代碼實現(xiàn)獲取服務(wù)器時間并格式化展示的方法,從而更好地滿足企業(yè)實際需求。    1、獲取服務(wù)器時間 獲取服務(wù)器時...

Dell服務(wù)器預(yù)計發(fā)貨時間查詢方法大全

Dell服務(wù)器預(yù)計發(fā)貨時間查詢方法大全

  在現(xiàn)代企業(yè)管理中,服務(wù)器的作用不可小覷,而Dell作為世界知名的硬件廠商,其服務(wù)器產(chǎn)品自然也是備受關(guān)注。然而對于用戶來說,更加關(guān)注的是Dell服務(wù)器的發(fā)貨時間,因為這關(guān)系到服務(wù)器能否按時到貨、開發(fā)測試進度的推進等問題。那么,Dell服務(wù)器預(yù)計發(fā)貨時間查詢方法又是怎樣的呢?下面將為大家詳細介紹。    1、查詢方法-官方網(wǎng)站 首先,Dell的官方網(wǎng)站是查詢服務(wù)器預(yù)計發(fā)貨時間的首選去處。用戶只需進入官網(wǎng)主頁,點擊“服務(wù)器”分類...

Apache服務(wù)器長連接超時時間怎么設(shè)置?

Apache服務(wù)器長連接超時時間怎么設(shè)置?

  文章概括:本文將為大家詳細介紹Apache服務(wù)器長連接超時時間的設(shè)置方法。我們將從四個方面進行闡述,分別是為什么要進行長連接超時時間的設(shè)置、設(shè)置長連接超時時間的步驟以及具體參數(shù)的解釋、如何調(diào)度Apache服務(wù)器和Nginx等Web服務(wù)器的超時時間以及其他注意事項。通過本文的閱讀,您將了解如何優(yōu)化Apache服務(wù)器長連接的運行效率,提高服務(wù)器的性能表現(xiàn)。   1、為什么要進行長連接超時時間的設(shè)置   Apache服務(wù)器是一款十分流行的Web服務(wù)器...

“穿越時空,重溫經(jīng)典——神武開放時間回顧”

“穿越時空,重溫經(jīng)典——神武開放時間回顧”

  全文概括:   “穿越時空,重溫經(jīng)典——神武開放時間回顧”展覽于近日在上海舉辦,吸引了上千名游戲愛好者前來參觀。這次展覽主要展示了神武游戲開放以來的發(fā)展歷程和重要時刻,為觀眾們帶來了獨特的視聽體驗。本文將從四個方面對這次展覽進行詳細的闡述,包括開放初期、游戲版本演化、社區(qū)互動、經(jīng)典瞬間等,讓讀者能夠更加全面地了解神武游戲的歷史和文化,重溫屬于自己的游戲記憶。    1、開放初期 神武游戲于2009年開放,...

Linux國家時間同步服務(wù)器及其使用方法

Linux國家時間同步服務(wù)器及其使用方法

  本文主要介紹Linux國家時間同步服務(wù)器及其使用方法。在現(xiàn)代社會,時間同步對于計算機網(wǎng)絡(luò)運行非常重要,為了保證系統(tǒng)之間時間同步的準確性,很多國家都設(shè)置了時間服務(wù)器。本文將從以下四個方面進行詳細闡述:1、什么是國家時間同步服務(wù)器;2、Linux系統(tǒng)設(shè)置國家時間同步服務(wù)器;3、使用國家時間同步服務(wù)器的好處;4、常見問題及解決方法。    1、什么是國家時間同步服務(wù)器 國家時間同步服務(wù)器是指由國家設(shè)置的用于提供網(wǎng)絡(luò)時間同步服務(wù)的...

linux系統(tǒng)ntp時間同步服務(wù)器操作方法及注意事項

linux系統(tǒng)ntp時間同步服務(wù)器操作方法及注意事項

  在Linux系統(tǒng)中,通過網(wǎng)絡(luò)時間協(xié)議(NTP)來同步服務(wù)器的時間非常重要。正確的時間同步可以確保許多系統(tǒng)進程和應(yīng)用程序正常運行,并有助于處理各種安全問題。本文將從四個方面詳細介紹Linux系統(tǒng)ntp時間同步服務(wù)器的操作方法及注意事項。    1、安裝ntp服務(wù) 在開始設(shè)置ntp服務(wù)器之前,需要確保已經(jīng)安裝了ntp服務(wù)。在大多數(shù)Linux系統(tǒng)上,ntp已經(jīng)預(yù)安裝了。可以通過以下命令檢查ntp服務(wù)是否已經(jīng)在系統(tǒng)上運行:...

Ice服務(wù)器啟用時間統(tǒng)計及分析報告

Ice服務(wù)器啟用時間統(tǒng)計及分析報告

  Ice服務(wù)器啟用時間統(tǒng)計及分析報告是作為服務(wù)器管理者必須掌握的知識,對服務(wù)器運行狀態(tài)進行有效的檢測和分析,為服務(wù)器穩(wěn)定運行和問題處理提供了有效保障。本文將從四個方面對Ice服務(wù)器啟用時間統(tǒng)計及分析報告進行詳細的闡述,包括統(tǒng)計的原因、統(tǒng)計方法、分析報告的內(nèi)容以及報告的應(yīng)用方法。通過本文的學(xué)習(xí),可以幫助你更好地掌握Ice服務(wù)器的運行狀態(tài),確保服務(wù)器穩(wěn)定運行。    1、統(tǒng)計的原因 每個服務(wù)器的啟用時間都是有限的,隨著使用的時間...

Cisco AD時間服務(wù)器:時鐘同步精準可靠

Cisco AD時間服務(wù)器:時鐘同步精準可靠

  文章描述:Cisco AD時間服務(wù)器是一種高精確度的時鐘同步設(shè)備,具有精準可靠的特點。本文將從四個方面對其進行詳細闡述,分別是時鐘同步技術(shù)、精度值、易于管理性和部署效率。通過此文,您可以更好地了解Cisco AD時間服務(wù)器的特點和優(yōu)勢,為您的網(wǎng)絡(luò)設(shè)備選擇提供更多選擇。    1、時鐘同步技術(shù) Cisco AD時間服務(wù)器內(nèi)置了高效的時鐘同步機制,使得不同網(wǎng)絡(luò)設(shè)備之間的時鐘同步更加精準可靠。其中最重要的技術(shù)是NTP(網(wǎng)絡(luò)時間協(xié)...

Linux服務(wù)器以時間為核心的管理方法

Linux服務(wù)器以時間為核心的管理方法

   Linux服務(wù)器以時間為核心的管理方法 Linux服務(wù)器作為一種開源、免費軟件,是目前使用最廣泛的服務(wù)器操作系統(tǒng)。服務(wù)器運行穩(wěn)定、性能優(yōu)異的特點使得它被廣泛應(yīng)用于各種互聯(lián)網(wǎng)相關(guān)的行業(yè)。而時間在Linux服務(wù)器中扮演著核心的角色,不僅用于服務(wù)器的系統(tǒng)時間同步,也可以通過時間參數(shù)來管理文件、任務(wù)、備份等。本文將介紹Linux服務(wù)器以時間為核心的管理方法,包括時間同步、時間參數(shù)的使用、如何管理文件、任務(wù)和備份。...

IBMC服務(wù)器時間設(shè)置及優(yōu)化方法

IBMC服務(wù)器時間設(shè)置及優(yōu)化方法

  IBMC服務(wù)器是企業(yè)級應(yīng)用中高性能計算機的重要組成部分,對于服務(wù)器時間的準確設(shè)置和精細優(yōu)化,可以保證系統(tǒng)運行效率和穩(wěn)定性,為企業(yè)提供更好的服務(wù)。本文將從以下四個方面,詳細闡述IBMC服務(wù)器時間的設(shè)置和優(yōu)化方法。    1、時間同步設(shè)置 時間同步是IBMC服務(wù)器時間設(shè)置中的基本內(nèi)容,它保證了多臺服務(wù)器之間時間的一致性和準確性。在集群環(huán)境下,如果服務(wù)器之間的時間不同步,會導(dǎo)致系統(tǒng)運行異常,影響業(yè)務(wù)穩(wěn)定性。因此,管理員需要在服務(wù)...

Linux服務(wù)器被鎖后的自救時間分析

Linux服務(wù)器被鎖后的自救時間分析

  在Linux服務(wù)器使用過程中,有可能會發(fā)生被鎖的情況,這對服務(wù)器運維人員來說是一件非常麻煩的事情,因為一旦服務(wù)器被鎖,就需要進行自救,而自救的時間很大程度上決定了服務(wù)器恢復(fù)正常運行的速度,因此,針對Linux服務(wù)器被鎖后的自救時間,我們進行了詳細的分析和總結(jié)。    1、鎖定原因分析 服務(wù)器被鎖的原因有很多種,比如系統(tǒng)崩潰、系統(tǒng)資源占用等,只有分析出具體的原因,才能有針對性的進行自救。...

MySQL修改服務(wù)器時間為北京時間

MySQL修改服務(wù)器時間為北京時間

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

Android實現(xiàn)服務(wù)器時間同步功能

Android實現(xiàn)服務(wù)器時間同步功能

  本文主要介紹如何在Android系統(tǒng)中通過實現(xiàn)服務(wù)器時間同步功能來確保系統(tǒng)時間的準確性。Android系統(tǒng)自帶了NTP時間同步協(xié)議,但是由于網(wǎng)絡(luò)延遲等原因,NTP協(xié)議有時候并不能保證時間同步的準確性,因此我們需要通過其他方法來確保時間同步的精度。    1、使用SNTP協(xié)議進行時間同步 SNTP協(xié)議是對NTP協(xié)議的超集,它在NTP協(xié)議的基礎(chǔ)上去掉了一些不必要的功能,并且簡化了協(xié)議格式,使得SNTP協(xié)議的實現(xiàn)更加方便。我們可...

主站蜘蛛池模板: 99热这里只有精品免费国产 | 免费国产人做人视频在线观看 | 青青青青久久久久国产 | 成人午夜免费视频毛片 | 欧美一级毛片片aa视频 | 狠狠色丁香婷婷综合久久来 | 久草视频播放 | 99精品国产自在现线观看 | 91网站视频在线观看 | 外国成人网在线观看免费视频 | 天天影视色香欲综合网 西瓜影音 | 中国日本高清免费视频网 | 九一毛片 | 国产在线视频国产永久视频 | 色老板成人永久免费视频 | 婷婷色基地 | 日本一级三级视频在线观看 | 亚洲男人影院 | 99精品久久秒播无毒不卡 | 手机福利片 | 九色视频在线观看 | a级毛片高清免费视频 | 香港三级日本三级人妇网站 | 波多野结衣一区在线 | 中日一级片 | 日本伦理中文字幕 | 国产成人精品免费视频大全五级 | 日本一区二区三区精品国产 | 曰本三级香港三级三级人 | 91在线视频网址 | 91在线 | 亚洲 | 99国产精品久久久久久久... | 欧美久 | 国产91久久最新观看地址 | 国内精品久久久久影院网站 | 一本到不卡 | 国产精品第一页在线 | 国产一区二区三区小说 | 秘密影院久久综合亚洲综合 | 亚洲不卡在线播放 | 精品久久久久久免费影院 |