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

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

admin2年前 (2023-07-12)時(shí)頻百科630

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

  

1、QNetworkDatagram的使用

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

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

  使用QNetworkDatagram類(lèi)來(lái)實(shí)現發(fā)送和接收數據包的代碼如下:

  ```

  QByteArray requestData(48, 0);

  requestData[0] = 0x1b; // 設置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());

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

  } else {

   qDebug() << "Request timeout";

  ```

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

  

2、將時(shí)間戳轉化為人類(lèi)可讀的時(shí)間

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

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

  ```

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

  unsigned long long NTP_TIMESTAMP_DELTA = 2208988800ull; // 參考時(shí)間: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位時(shí)間戳分別存儲在high和low變量中,然后將它們拼接成一個(gè)新的64位時(shí)間戳ntp_time。接著(zhù),我們根據參考時(shí)間以及加上ntp_time計算出QDateTime對象current表示當前時(shí)間。

  

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

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

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

  ```

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

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

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

  

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

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

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

  ```

  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)行時(shí)間戳處理

   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); // 設置線(xiàn)程池最大線(xiàn)程數

   }

   ~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 )建了一個(gè)名為T(mén)imeRunnable的類(lèi),其中包含發(fā)送和接收NTP請求的代碼,并通過(guò)signals和slots機制與MainWindow類(lèi)連接。在MainWindow類(lèi)中,我們首先創(chuàng )建了一個(gè)QThreadPool對象,并在onStart()槽函數中,用服務(wù)器名字自動(dòng)運行TimeRunnable的實(shí)例,并將currentTime信號與onTime槽函數連接,以便在收到服務(wù)器時(shí)間時(shí)輸出到控制臺上。

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

  總結:

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

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

相關(guān)文章

【科技】服務(wù)器時(shí)間自動(dòng)同步,實(shí)現遠程時(shí)區調整

【科技】服務(wù)器時(shí)間自動(dòng)同步,實(shí)現遠程時(shí)區調整

  科技已經(jīng)深度滲入我們的生活中,服務(wù)器時(shí)間自動(dòng)同步實(shí)現遠程時(shí)區調整,也是其中一個(gè)重要應用之一。本文將從應用背景、技術(shù)原理、實(shí)際操作、優(yōu)缺點(diǎn)四個(gè)方面詳細闡述科技服務(wù)器時(shí)間自動(dòng)同步,實(shí)現遠程時(shí)區調整的具體內容。    1、應用背景 有時(shí)候我們需要在不同時(shí)區進(jìn)行遠程協(xié)作,在遠程協(xié)作的過(guò)程中,時(shí)間同步顯得尤為重要。因此,需要一種能夠實(shí)現時(shí)間同步的機制,以確保遠程協(xié)作的順利開(kāi)展??萍挤?wù)器時(shí)間自動(dòng)同步,實(shí)現遠程時(shí)區調整,就是為了這一目...

ESXi服務(wù)器修改時(shí)區方法,簡(jiǎn)單易上手!

ESXi服務(wù)器修改時(shí)區方法,簡(jiǎn)單易上手!

  ESXi服務(wù)器是一款被廣泛使用的虛擬化軟件,它能夠讓用戶(hù)在一臺物理服務(wù)器上運行多個(gè)虛擬機,從而提高計算資源的利用率和靈活性。然而,在使用ESXi服務(wù)器的過(guò)程中,有時(shí)候會(huì )需要修改服務(wù)器的時(shí)區設置。本文將從幾個(gè)方面介紹ESXi服務(wù)器修改時(shí)區的方法,讓你能夠輕松地完成操作。    1、通過(guò)vSphere Web Client修改ESXi服務(wù)器時(shí)區 vSphere Web Client是ESXi服務(wù)器的管理工具之一,它可以讓用戶(hù)通...

Java如何獲取服務(wù)器連接超時(shí)時(shí)間?

Java如何獲取服務(wù)器連接超時(shí)時(shí)間?

  本文將從四個(gè)方面,詳細闡述如何在Java中獲取服務(wù)器連接超時(shí)時(shí)間。首先,我們需要了解什么是服務(wù)器連接超時(shí)時(shí)間,它是我們在進(jìn)行網(wǎng)絡(luò )操作時(shí),設定的等待服務(wù)器響應的最長(cháng)時(shí)間。在網(wǎng)絡(luò )不穩定或服務(wù)器響應慢的情況下,設置合理的連接超時(shí)時(shí)間能夠保證程序的穩定性及效率。    1、使用URLConnection獲取連接超時(shí)時(shí)間 在Java中使用URLConnection發(fā)送HTTP請求獲取數據時(shí),可以通過(guò)設置URLConnection對象...

iSecure平臺服務(wù)器時(shí)間管理優(yōu)化方案的研究與實(shí)施

iSecure平臺服務(wù)器時(shí)間管理優(yōu)化方案的研究與實(shí)施

  本文主要介紹iSecure平臺服務(wù)器時(shí)間管理優(yōu)化方案的研究與實(shí)施。iSecure平臺是一款網(wǎng)絡(luò )安全管理系統軟件,它可以用來(lái)監控網(wǎng)絡(luò )流量,防止網(wǎng)絡(luò )攻擊以及提供日志記錄和審計功能等。在實(shí)際應用中,為了確保系統的安全性,服務(wù)器的時(shí)間管理是非常重要的一個(gè)環(huán)節。因此,本文將從四個(gè)方面對iSecure平臺服務(wù)器時(shí)間管理優(yōu)化方案做詳細的闡述。    1、時(shí)間同步配置 在實(shí)際應用中,不同的服務(wù)器之間的時(shí)間往往存在差異,而iSecure平臺...

EVE歐服服務(wù)器維護:新舉措提高游戲穩定性

EVE歐服服務(wù)器維護:新舉措提高游戲穩定性

  隨著(zhù)EVE Online歐服服務(wù)器的不斷壯大,游戲穩定性越來(lái)越受到玩家們的關(guān)注。為了提高游戲穩定性,EVE歐服服務(wù)器維護推出了一系列全新的舉措。本文將從4個(gè)方面對EVE歐服服務(wù)器維護:新舉措提高游戲穩定性做出詳細闡述,并對其進(jìn)行總結歸納。    1、優(yōu)化服務(wù)器配置 為了提高游戲服務(wù)器的運行效率,EVE歐服對服務(wù)器配置進(jìn)行了優(yōu)化。首先,硬件配置上進(jìn)行了升級,所有服務(wù)器都配備了最新的固態(tài)硬盤(pán)和高速網(wǎng)絡(luò )接口卡,以保證快速響應用戶(hù)...

Java實(shí)現獲取服務(wù)器響應時(shí)間的方法及注意事項

Java實(shí)現獲取服務(wù)器響應時(shí)間的方法及注意事項

  本文將以Java實(shí)現獲取服務(wù)器響應時(shí)間的方法及注意事項為中心,全文分成多個(gè)自然段,每個(gè)自然段字數控制均勻一些,詳細闡述獲取服務(wù)器響應時(shí)間的方法以及需要注意的事項。    1、基本原理 獲取服務(wù)器響應時(shí)間是測量服務(wù)器的計算能力的重要指標之一。服務(wù)端需要把客戶(hù)端的請求處理完畢后,才能給客戶(hù)端響應結果,因此,獲取服務(wù)器響應時(shí)間的關(guān)鍵在于如何確定客戶(hù)端發(fā)出請求和服務(wù)端響應導致本地程序得到結果所花費的時(shí)間。...

Linux服務(wù)器NTP時(shí)間同步配置指南

Linux服務(wù)器NTP時(shí)間同步配置指南

  本文將為讀者詳細介紹如何在Linux服務(wù)器上進(jìn)行NTP時(shí)間同步配置,并且按照以下4個(gè)方面進(jìn)行闡述:NTP時(shí)間同步及原理、NTP服務(wù)的安裝、配置及管理、Linux服務(wù)器的NTP同步及調整、NTP服務(wù)及其性能調優(yōu)。希望本文能夠幫助讀者全面地掌握Linux服務(wù)器的NTP時(shí)間同步技術(shù)。    1、NTP時(shí)間同步及原理 NTP全稱(chēng)為Network Time Protocol,是一種計算機網(wǎng)絡(luò )協(xié)議,用于同步各個(gè)計算機的系統時(shí)鐘。在Li...

Linux系統NTP時(shí)間同步服務(wù)器設置方法

Linux系統NTP時(shí)間同步服務(wù)器設置方法

  本文將詳細介紹Linux系統NTP時(shí)間同步服務(wù)器的設置方法。在Linux操作系統中,NTP(Network Time Protocol)是一種用于向網(wǎng)絡(luò )中的計算機提供時(shí)間標準的協(xié)議,它能夠自動(dòng)同步整個(gè)系統的時(shí)間,確保全局時(shí)間準確無(wú)誤。該設置對于需要對時(shí)間精度有嚴格要求的應用場(chǎng)景是非常重要的。下面將從4個(gè)方面分別介紹Linux系統NTP時(shí)間同步服務(wù)器的設置方法。    1、安裝NTP服務(wù)器 要想使用NTP時(shí)間同步服務(wù)器,系統...

JavaScript獲取服務(wù)器時(shí)間的局限性分析

JavaScript獲取服務(wù)器時(shí)間的局限性分析

  JavaScript獲取服務(wù)器時(shí)間的局限性分析   文章簡(jiǎn)介:   隨著(zhù)現代技術(shù)的不斷發(fā)展,前端JavaScript越來(lái)越重要。而在很多項目中,需要獲取服務(wù)器的時(shí)間來(lái)進(jìn)行計算和展示。但是JavaScript獲取服務(wù)器時(shí)間存在局限性,這篇文章將從以下四個(gè)方面對其進(jìn)行詳細的分析和闡述:同步問(wèn)題、誤差問(wèn)題、時(shí)區問(wèn)題、代碼問(wèn)題。   1、同步問(wèn)題   JavaScript獲取服務(wù)器時(shí)間的方式通常是通過(guò)AJAX獲取。但...

DayZ獨立版服務(wù)器刷新時(shí)間全解析

DayZ獨立版服務(wù)器刷新時(shí)間全解析

  DayZ獨立版是一款非常流行的生存游戲。游戲中的刷新時(shí)間對玩家來(lái)說(shuō)非常重要。本文將從4個(gè)方面對DayZ獨立版服務(wù)器刷新時(shí)間進(jìn)行全面解析,幫助玩家更好地了解游戲機制。    1、DayZ獨立版服務(wù)器刷新時(shí)間的概念與意義 DayZ獨立版服務(wù)器刷新時(shí)間指的是補給、掉落物品、怪物等游戲元素在服務(wù)器中重生的時(shí)間間隔。服務(wù)器工作了一定時(shí)間后,游戲中很多元素會(huì )被消耗或者死亡,重生時(shí)間就是這些元素重新在服務(wù)器出現的時(shí)間間隔。...

GPS時(shí)間服務(wù)器突變:時(shí)間標準再度遇險!

GPS時(shí)間服務(wù)器突變:時(shí)間標準再度遇險!

  最近,GPS時(shí)間服務(wù)器突變引起了廣泛的關(guān)注。時(shí)間標準再度遇險,這不僅對GPS應用產(chǎn)生了影響,也牽動(dòng)著(zhù)全球用戶(hù)對時(shí)間標準的信任度。本文將從四個(gè)方面詳細闡述這次GPS時(shí)間服務(wù)器突變事件。    1、GPS時(shí)間服務(wù)器什么是時(shí)間標準? 時(shí)間標準是灰常重要的一個(gè)概念,它用來(lái)定義一個(gè)時(shí)間系統,精確測量時(shí)間,確保全球互聯(lián)網(wǎng)、GPS、航空航天、鐵路等廣泛應用可以準確同步。如果時(shí)間標準出現問(wèn)題,設備之間的時(shí)間差就會(huì )發(fā)生偏移,數據處理就會(huì )受到...

DHCP服務(wù)器租用時(shí)間解釋及示例

DHCP服務(wù)器租用時(shí)間解釋及示例

  DHCP(Dynamic Host Configuration Protocol)是指動(dòng)態(tài)主機配置協(xié)議,是因特網(wǎng)工程任務(wù)組(IETF)制定的一種局域網(wǎng)的網(wǎng)絡(luò )協(xié)議,它通過(guò)中央管理的方式,為局域網(wǎng)中的設備自動(dòng)分配IP地址和其他網(wǎng)絡(luò )參數,以實(shí)現網(wǎng)絡(luò )自動(dòng)化管理。DHCP服務(wù)器租用時(shí)間是指DHCP服務(wù)器為客戶(hù)端分配IP地址的時(shí)限,當超過(guò)這個(gè)時(shí)限,DHCP服務(wù)器就會(huì )收回所分配的IP地址,以便其他客戶(hù)端使用。    1、DHCP服務(wù)器租用時(shí)間的概...

Linux修改服務(wù)器時(shí)間無(wú)效的解決方法

Linux修改服務(wù)器時(shí)間無(wú)效的解決方法

  今天我們來(lái)談?wù)凩inux修改服務(wù)器時(shí)間無(wú)效的解決方法。有時(shí)我們需要把Linux服務(wù)器上的時(shí)間進(jìn)行手動(dòng)設置,但可能會(huì )發(fā)現時(shí)間修改失敗,這就給我們的使用帶來(lái)了一定的影響。那么,如何解決這個(gè)問(wèn)題呢?本文將從四個(gè)方面進(jìn)行詳細的闡述,幫助您快速地解決問(wèn)題。    1、檢查硬件時(shí)間 首先,我們需要檢查服務(wù)器上的硬件時(shí)間是否正確。因為如果硬件時(shí)間與要設置的時(shí)間間隔比較大,系統會(huì )選擇保留硬件時(shí)間,而不會(huì )設置新的時(shí)間。因此,我們需要通過(guò)以下...

Linux服務(wù)器網(wǎng)絡(luò )交互時(shí)間優(yōu)化

Linux服務(wù)器網(wǎng)絡(luò )交互時(shí)間優(yōu)化

  本文主要圍繞Linux服務(wù)器網(wǎng)絡(luò )交互時(shí)間優(yōu)化展開(kāi)討論。隨著(zhù)互聯(lián)網(wǎng)應用的快速發(fā)展,服務(wù)器的負載和并發(fā)量不斷增加,如何提高網(wǎng)絡(luò )交互時(shí)間成為了服務(wù)器性能優(yōu)化的重要方向。本文將從四個(gè)方面,即網(wǎng)絡(luò )拓撲優(yōu)化、協(xié)議優(yōu)化、應用程序優(yōu)化和緩存優(yōu)化,來(lái)詳細闡述Linux服務(wù)器網(wǎng)絡(luò )交互時(shí)間優(yōu)化的方法和技巧。    1、網(wǎng)絡(luò )拓撲優(yōu)化 網(wǎng)絡(luò )拓撲是指網(wǎng)絡(luò )中各種網(wǎng)絡(luò )節點(diǎn)之間的連接方式和布局方式。合理的網(wǎng)絡(luò )拓撲可以降低網(wǎng)絡(luò )延遲和丟包率,提高網(wǎng)絡(luò )交互時(shí)間。...

CentOS時(shí)間同步服務(wù)器地址設置及優(yōu)化

CentOS時(shí)間同步服務(wù)器地址設置及優(yōu)化

  本文主要介紹了CentOS時(shí)間同步服務(wù)器地址設置及優(yōu)化的相關(guān)知識,主要包括NTP服務(wù)介紹、CentOS時(shí)間同步的原理及方法、常見(jiàn)問(wèn)題及解決方案、優(yōu)化時(shí)間同步性能等方面。通過(guò)本文的學(xué)習,讀者可以深入了解CentOS時(shí)間同步服務(wù)器地址設置及優(yōu)化的相關(guān)內容,掌握相關(guān)操作技能,從而提高服務(wù)器的時(shí)間同步性能。    1、NTP服務(wù)介紹 網(wǎng)絡(luò )時(shí)間協(xié)議(NTP)是一種用于在計算機網(wǎng)絡(luò )中同步系統時(shí)鐘的協(xié)議。它利用一個(gè)參考時(shí)鐘和許多客戶(hù)機之...

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