97免费视频在线播放_亚洲欧洲精品成人久久奇米网_色姑娘资源站_嫩草嫩草嫩草嫩草_久久久一本精品99久久精品_影音先锋5566资源网_日韩成人激情

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

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

  使用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提供了不少思路。

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

標簽: 時頻百科

相關文章

Linux服務器時間修改指南

Linux服務器時間修改指南

  Linux服務器時間修改是每個Linux系統管理員都需要掌握的技能之一。不管是為了防止安全問題還是確保系統運行正常,時間同步都是非常重要的。本篇文章將從四個方面進行詳細闡述Linux服務器時間修改的指南,幫助管理員更好地了解和掌握這一技能。    1、ntp服務的安裝和配置 ntp服務是Linux服務器時間同步的重要組件之一。在該部分,我們將探討如何安裝和配置ntp服務,以實現自動同步系統時間的目的。...

ESXi服務器時間更新問題解決方法

ESXi服務器時間更新問題解決方法

  本文旨在深入探究ESXi服務器時間更新問題的解決方法。本文將從以下四個方面對這個問題做出詳細的闡述:NTP服務設置、手動時間修改、時區設置和固件設置。本文將為管理員提供實用的指導和技巧,幫助他們快速解決ESXi服務器時間更新問題,為企業環境的穩定運行保駕護航。    1、NTP服務設置 NTP服務是ESXi服務器觀察時間的重要工具。配置正確的NTP服務器將有助于解決服務器時鐘更新問題,同時確保系統所有節點之間的時鐘保持同步...

Java編寫獲取服務器時間的方法

Java編寫獲取服務器時間的方法

  Java編寫獲取服務器時間,是一項基礎而重要的功能,本文將從四個方面對Java編寫獲取服務器時間的方法做詳細的闡述。首先,我們需要了解Java獲取服務器時間的基礎知識,接著將分別介紹Java獲取系統時間、Java獲取網絡時間、Java獲取時區時間和Java獲取時間戳四個方面,最后通過總結歸納來結束本文。    1、Java獲取系統時間 Java獲取系統時間是指獲取本機操作系統時間,與服務器系統無關。...

CentOS服務器時間修改教程,詳盡易懂!

CentOS服務器時間修改教程,詳盡易懂!

  本文將詳細闡述如何在CentOS服務器上修改時間,并分為四個方面進行闡述。首先,我們將介紹CentOS服務器時間的概念和如何查看當前的系統時間。其次,我們將闡述如何手動修改系統時間,并提供使用命令行修改時間的方法。接下來,我們將討論如何自動同步系統時間,以確保服務器時間的準確性。最后,我們將總結所學并提供一些小技巧幫助讀者更好地管理服務器時間。    1、概念和查看當前系統時間 在開始討論如何修改CentOS服務器時間之前...

Linux系統下查詢服務器時間方法分享

Linux系統下查詢服務器時間方法分享

  本文將介紹Linux系統下查詢服務器時間的方法。首先,我們需要知道正確的服務器時間對于日常管理和監控非常重要。在本文中,我們將從以下四個方面分享Linux系統下如何查詢服務器時間:    1、使用date命令查看服務器時間 date命令是最常用的命令之一,它可以顯示當前的系統時間和日期,還可以用于設置系統時間。要查看服務器時間,請在終端中輸入date命令并按Enter鍵。   這將...

HP服務器系統時鐘延遲導致運維故障,怎么辦?

HP服務器系統時鐘延遲導致運維故障,怎么辦?

  HP服務器系統時鐘延遲是導致許多運維故障的一個常見問題。這可能會導致系統時間不準確,引起各種錯誤,影響服務器的正常運行。本文將從四個方面探討,當出現HP服務器系統時鐘延遲時,應該如何處理。    1、檢測時鐘延遲問題 首先,當出現HP服務器系統時鐘延遲時,必須首先檢測時鐘延遲問題。可以通過以下方法快速檢測該問題:   1)使用ntpstat命令檢查NTP服務器狀態是否良好;...

Nginx服務器時間錯誤如何解決?

Nginx服務器時間錯誤如何解決?

  本文將根據Nginx服務器出現時間錯誤的問題,結合解決方案,提供4個方面的詳細闡述,包括:1、檢查服務器時間設置是否正確;2、同步網絡時間;3、使用Nginx自帶時間模塊;4、使用第三方時間模塊。以下將分別進行詳細說明。   Nginx服務器時間錯誤如何解決?   服務器時間錯誤可能會導致很多問題,例如日志記錄異常、證書出現問題等等。同時,在Nginx服務器中,由于各種工具之間連接的頻繁進行,時序之間的一致性就顯得尤為重要。下面將從多個方面進行...

【如何以電腦服務器時間為中心進行時間調整】

【如何以電腦服務器時間為中心進行時間調整】

  本文主要探討如何以電腦服務器時間為中心進行時間調整,以確保各類應用程序的準確性和時效性。時間同步是服務器管理中必不可少的一環,它不僅關系到各種系統任務的正常執行,也直接影響到網絡的準確性和可靠性。因此,本文將從以下四個方面詳細闡述如何以電腦服務器時間為中心進行時間調整。    1、配置網絡時間協議(NTP) 網絡時間協議(NTP)是一種用于同步計算機系統時鐘的協議,其作用是為多個設備提供準確的時間源。因此,配置NTP可以使...

Linux服務器時間查看方法詳解

Linux服務器時間查看方法詳解

  在Linux服務器的管理過程中,時間的準確性是非常關鍵的。因此,了解如何正確查看服務器的時間是非常重要的。本文將從以下四個方面詳細介紹Linux服務器時間查看方法。    1、查看當前時間 要查看Linux服務器的當前時間,請使用date命令。該命令還可以用于設置服務器的時間。   要查看服務器的當前時間,請在終端輸入以下命令:   ...

Linux命令行查詢時間服務器方法

Linux命令行查詢時間服務器方法

  本文將為大家介紹如何在Linux命令行查詢時間服務器,該方法可用于在Linux系統中同步時間,保證系統時鐘的準確性和一致性。    1、時間服務器 時間服務器是一臺專門用于同步時間的計算機,有時也被稱為網絡時鐘或NTP服務器。時間服務器的作用是為客戶端提供準確的時間信息,這些信息用于同步客戶端系統的時鐘。   時間服務器可以連接到GPS衛星、原子鐘或其他可靠的時間源,以保證其提供的...

JavaScript獲取服務器時間的局限性分析

JavaScript獲取服務器時間的局限性分析

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

Dell服務器BIOS時間修改操作指南

Dell服務器BIOS時間修改操作指南

  本文主要介紹如何在Dell服務器上修改BIOS時間。在工作中,我們經常需要對服務器的時間進行修改,以確保服務器的系統時間與其他系統的系統時間同步。修改Dell服務器BIOS時間可以使用不同的方法,但是本文將著重討論使用Dell PowerEdge服務器時的步驟。    1、進入BIOS設置界面 要修改Dell服務器的BIOS時間,首先需要進入BIOS設置界面。常見的方法是在服務器上啟動時按下F2鍵。在進入BIOS設置界面后...

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

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

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

Linux系統內服務器時間同步方案

Linux系統內服務器時間同步方案

  本文將圍繞Linux系統內服務器時間同步方案進行詳細闡述。首先,整篇文章將從時間同步的重要性說起,介紹Linux系統內默認的時間同步方案以及其不足之處,然后分別探討使用NTP、Chrony、Systemd-timedatectl等方案對服務器時間同步的優缺點和應用,最后對全文進行總結,提出一些具體的建議。    1、NTP方案 NTP(Network Time Protocol)是目前廣泛使用的一種網絡時間協議,它可以在I...

Linux服務器網絡交互時間優化

Linux服務器網絡交互時間優化

  本文主要圍繞Linux服務器網絡交互時間優化展開討論。隨著互聯網應用的快速發展,服務器的負載和并發量不斷增加,如何提高網絡交互時間成為了服務器性能優化的重要方向。本文將從四個方面,即網絡拓撲優化、協議優化、應用程序優化和緩存優化,來詳細闡述Linux服務器網絡交互時間優化的方法和技巧。    1、網絡拓撲優化 網絡拓撲是指網絡中各種網絡節點之間的連接方式和布局方式。合理的網絡拓撲可以降低網絡延遲和丟包率,提高網絡交互時間。...

97免费视频在线播放_亚洲欧洲精品成人久久奇米网_色姑娘资源站_嫩草嫩草嫩草嫩草_久久久一本精品99久久精品_影音先锋5566资源网_日韩成人激情
亚洲精品视频一区| 国产精品理论片在线观看| 色呦呦网站一区| av网站免费线看精品| 成人av电影在线观看| 97se亚洲国产综合自在线不卡| 99久久精品免费精品国产| 91免费在线视频观看| 在线观看日韩国产| 欧美一区二区三区四区高清| 日韩一区二区三区在线视频| www国产精品av| 中文字幕中文在线不卡住| 亚洲精品免费看| 日韩av电影天堂| 成人开心网精品视频| 91黄色小视频| 精品噜噜噜噜久久久久久久久试看 | 欧美久久一二区| 日韩一级大片在线| 国产精品亲子伦对白| 亚洲电影激情视频网站| 狠狠v欧美v日韩v亚洲ⅴ| 国产mv日韩mv欧美| 欧美日韩一级黄| 国产欧美日韩三区| 亚洲国产欧美一区二区三区丁香婷| 视频一区视频二区中文字幕| 国产一区二区三区在线观看免费| 暴力调教一区二区三区| 日韩一卡二卡三卡国产欧美| 国产婷婷色一区二区三区| 亚洲午夜久久久久| 国产一区二区在线电影| 欧美性感一区二区三区| 国产日本亚洲高清| 喷水一区二区三区| 一本色道亚洲精品aⅴ| 久久奇米777| 日本不卡一二三区黄网| av电影天堂一区二区在线观看| 欧美一级电影网站| 亚洲精品成人a在线观看| 国产麻豆视频一区二区| 欧美一区二区高清| 亚洲一区在线视频| 99久久久无码国产精品| 久久久久久久久久美女| 午夜欧美视频在线观看| 91国产成人在线| 国产精品三级久久久久三级| 久久99国产精品免费网站| 欧美人牲a欧美精品| 一区二区三区欧美日韩| 成人av在线一区二区三区| 精品国产一区二区三区忘忧草| 三级成人在线视频| 欧美午夜精品免费| 亚洲不卡一区二区三区| 欧美日韩色综合| 亚洲一二三四在线观看| 一本到不卡免费一区二区| 亚洲日本免费电影| 91影视在线播放| 亚洲欧美偷拍三级| 色播五月激情综合网| 玉足女爽爽91| 欧美午夜电影在线播放| 日韩成人免费在线| 日韩一卡二卡三卡四卡| 六月丁香综合在线视频| 精品国产免费久久 | 国产精品久久久久天堂| 国产不卡视频在线观看| 国产精品福利影院| 日本久久电影网| 天堂va蜜桃一区二区三区| 日韩一级片在线播放| 国产一区二区不卡| 中文字幕 久热精品 视频在线| 成人深夜在线观看| 亚洲欧美国产毛片在线| 欧美日韩高清一区二区三区| 日韩精品电影在线| 国产亚洲一区二区三区四区| 成人网男人的天堂| 午夜视频在线观看一区| 欧美成人女星排名| 成人免费福利片| 亚洲午夜羞羞片| 精品国产一区二区三区久久影院 | 亚洲国产精品ⅴa在线观看| 不卡视频在线观看| 天堂精品中文字幕在线| 久久美女艺术照精彩视频福利播放 | 精品人伦一区二区色婷婷| 国产成人精品免费网站| 亚洲国产日韩a在线播放| 欧美sm美女调教| 91亚洲精品久久久蜜桃| 蜜臀av一区二区| 亚洲免费av高清| 精品不卡在线视频| 欧美最猛黑人xxxxx猛交| 精品中文字幕一区二区小辣椒| 中文字幕一区二区三区四区不卡| 91麻豆免费在线观看| 久久爱www久久做| 亚洲综合激情网| 国产亚洲一二三区| 91精品国产高清一区二区三区 | 99天天综合性| 男人操女人的视频在线观看欧美| 中文字幕日韩精品一区| 欧美变态口味重另类| 欧美日韩久久久| 成人性生交大片免费看视频在线 | 国产成人在线影院 | 国产精品久久久久婷婷二区次| 制服视频三区第一页精品| 99视频一区二区| 国产精品一区久久久久| 免费美女久久99| 一区二区三区精品视频| 国产精品成人免费在线| 久久久国产精华| 欧美电视剧免费观看| 欧美中文字幕亚洲一区二区va在线| 紧缚奴在线一区二区三区| 丝袜诱惑亚洲看片| 亚洲国产一二三| 亚洲一区二区三区影院| 一区二区在线看| 亚洲免费av高清| 亚洲激情图片小说视频| 亚洲欧美视频在线观看| 亚洲视频小说图片| 最新热久久免费视频| 国产精品国产三级国产aⅴ入口| 久久久久成人黄色影片| 国产午夜亚洲精品午夜鲁丝片| 日韩情涩欧美日韩视频| 欧美变态凌虐bdsm| 精品国产乱码久久久久久久久| 精品奇米国产一区二区三区| 精品免费国产二区三区| 精品国产青草久久久久福利| www久久久久| 国产偷国产偷精品高清尤物| 久久精品视频一区二区| 国产精品网站在线观看| 亚洲视频免费在线观看| 亚洲大片免费看| 日本麻豆一区二区三区视频| 捆绑紧缚一区二区三区视频| 国产一区二区按摩在线观看| 国产一区二区三区日韩| 成人高清免费观看| 91国在线观看| 制服丝袜日韩国产| www精品美女久久久tv| 国产精品无圣光一区二区| 亚洲猫色日本管| 日韩不卡在线观看日韩不卡视频| 极品瑜伽女神91| 成人国产精品免费观看视频| 欧美综合色免费| 日韩三级视频中文字幕| 国产欧美日本一区二区三区| 亚洲男女一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 成人免费av资源| 欧美伦理影视网| 欧美经典一区二区三区| 亚洲电影第三页| 国产一区啦啦啦在线观看| 紧缚捆绑精品一区二区| 成人福利电影精品一区二区在线观看| 色素色在线综合| 精品国产乱码久久| 亚洲精品国产一区二区三区四区在线 | 精品久久一二三区| 亚洲色图第一区| 毛片不卡一区二区| 91丨porny丨户外露出| 日韩区在线观看| 亚洲国产日产av| 成人免费看的视频| 精品入口麻豆88视频| 亚洲一区二区3| 99久久精品免费看国产免费软件| 51精品国自产在线| 亚洲精品视频在线观看免费| 国产一区二区在线观看免费| 欧美日韩激情一区二区| 综合激情成人伊人| 国产91露脸合集magnet| 精品乱人伦小说| 日本vs亚洲vs韩国一区三区二区| 在线观看视频欧美|