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

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

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

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

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

標簽: 時頻百科

相關文章

DCN日志服務器時間管理策略

DCN日志服務器時間管理策略

  DCN日志服務器時間管理策略是一種針對網絡設備中日志記錄的安全策略,旨在協助網絡管理員更好地管理、監測和安全備份網絡設備上的日志數據。本文將從四個方面對該策略進行詳細闡述,幫助讀者全面了解該策略的作用和實施方法。    1、時間同步管理 時間同步管理是DCN日志服務器時間管理策略的核心內容。它涉及到各種網絡設備的時間同步,包括時鐘設置、ntp服務、時間域名系統和協議等,協同完成對各種網絡設備的本地時間同步管理。...

CentOS配置時間服務器地址詳解

CentOS配置時間服務器地址詳解

  CentOS是一種被廣泛使用的Linux發行版。為了確保系統時間的準確性,管理員可以配置一個時間服務器地址,以確保系統時間的同步。本文將詳細介紹如何在CentOS中配置時間服務器地址。    1、檢查當前的時間設置 在更改時間服務器之前,我們需要檢查當前時間的設置。運行以下命令:   date   該命令會顯示當前的時間和日期。確保與您所在...

ABAP代碼實現獲取服務器時間并格式化展示

ABAP代碼實現獲取服務器時間并格式化展示

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

IPv6母根服務器歷史上線時間及其影響簡介

IPv6母根服務器歷史上線時間及其影響簡介

  IPv6母根服務器是現代互聯網中不可或缺的重要組成部分,隨著IPv6技術的普及,母根服務器的歷史上線時間也成為了研究的熱點。本文將從四個方面對IPv6母根服務器歷史上線時間及其影響簡介做詳細闡述。    1、母根服務器的歷史背景 互聯網母根服務器,簡稱“母根”,是整個互聯網域名系統的根,負責管理互聯網域名系統(DNS)中的頂級域名。IPv6母根服務器的概念首先由國際互聯網工程任務組(IETF)在20世紀90年代提出,旨在解...

DNS服務器更新時間如何對網站訪問速度產生影響?

DNS服務器更新時間如何對網站訪問速度產生影響?

  本文將闡述DNS服務器更新時間對網站訪問速度的影響。通過深入探討DNS服務器更新的四個方面,我們可以清楚地了解到如何優化網站的訪問速度。    1、DNS服務器更新時間對域名解析速度的影響 域名解析是瀏覽器訪問某個網站的第一步。DNS服務器負責將域名解析為IP地址,以便瀏覽器訪問。DNS服務器更新時間過長,可能導致域名解析的速度變慢。這會導致網站訪問速度變慢,影響用戶體驗。   比...

Java如何獲取服務器連接超時時間?

Java如何獲取服務器連接超時時間?

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

macmini同步時間無法找到服務器的解決方法

macmini同步時間無法找到服務器的解決方法

  近年來,蘋果的Mac系統備受用戶追捧,但在使用過程中難免會遇到問題。其中,macmini同步時間無法找到服務器問題是一個常見的困擾用戶的問題。本文將從多個角度詳細闡述macmini同步時間無法找到服務器的解決方法,從而解決這一問題,提高用戶的使用體驗。    1、檢查網絡連接 首先,用戶需要檢查本地網絡連接。由于時間同步需要連接到互聯網上的標準時間服務器,如果網絡連接不穩定或不可用,則無法成功同步時間。用戶可以嘗試重新連接...

“時間之門”的故事:服務器與現實的交匯點

“時間之門”的故事:服務器與現實的交匯點

  文章內容簡介:本文將圍繞著“時間之門”的故事,探討服務器與現實的交匯點。首先闡述故事的背景和基本情節,隨后從時間、空間、科技以及哲學四個方面,進行詳細的闡述和探討。最后對全文進行總結和歸納,為讀者呈現一個關于時間和技術的思考和想象。    1、時間 時間是一個神秘而又復雜的概念,也是“時間之門”故事的靈魂。在故事中,主人公使用了一臺能夠穿越時間和空間的服務器,實現了穿越時空的目的。但同時,時間也讓人感到無比的無奈和渺小。隨...

Linux打印服務器時間管理系統

Linux打印服務器時間管理系統

  全文簡要概括:    Linux打印服務器時間管理系統詳解 本文主要介紹Linux打印服務器時間管理系統。文章將從四個方面對該系統進行詳細闡述,包括系統的基本概念與構架、系統的安裝與配置、系統的特點和優勢以及系統的應用場景和案例。文章通過深度剖析,旨在為讀者提供一個更加全面深入的了解和認識,幫助讀者更好地應用該系統。    1、系統的基...

Cisco時間服務器的配置步驟詳解

Cisco時間服務器的配置步驟詳解

  本篇文章主要是為了讓大家更好地了解和掌握Cisco時間服務器的配置步驟。在網絡系統中,時間同步一直是一個重要的問題,時間同步不僅僅涉及到文件訪問的記錄和文件的創建時間,還影響到安全憑證和網絡安全事件的記錄等等。因此,在網絡系統的構建中,需要對時間進行統一同步,這時候Cisco時間服務器就應運而生。那么,到底Cisco時間服務器的配置步驟是怎樣的呢?    1、配置時間服務器 第一步:登錄Router設備,進入全局配置模式。...

Linux服務器時間設置與同步方法詳解

Linux服務器時間設置與同步方法詳解

  本文將圍繞Linux服務器時間設置與同步方法進行詳細闡述,涵蓋了系統時間、時區設置、NTP協議和手動時間同步四個方面。其中,系統時間和時區設置是時間同步的前提,NTP協議是常用的自動時間同步方式,手動時間同步則可以在NTP協議無法使用的情況下進行。通過本文的學習,您將掌握Linux服務器時間設置與同步的方法與技巧。    1、系統時間設置 系統時間是指硬件時鐘(RTC)所表示的時間,Linux系統啟動時會將其讀入內核并設置...

NTP服務器時間同步配置指南

NTP服務器時間同步配置指南

  本文將圍繞NTP服務器時間同步配置指南展開,從四個方面對該主題進行詳細闡述。第一部分將介紹NTP的基本概念以及為什么需要進行時間同步;第二部分將介紹如何查看系統時間、系統時間的配置以及電腦時間的同步方法;第三部分將介紹如何使用Linux操作系統進行時間同步配置以及服務器和客戶端的關系;第四部分將介紹Windows操作系統下的時間同步配置和常見問題及解決方法。通過本文,希望讀者對NTP服務器時間同步配置擁有更深入的理解和掌握。   ...

「利用Windows時間服務器同步電腦時間,保證您的永遠準確無誤」

「利用Windows時間服務器同步電腦時間,保證您的永遠準確無誤」

  隨著科技的不斷發展,電腦在我們日常生活中扮演著越來越重要的角色。但是,在操作電腦時,我們常常會遇到一個相當頭痛的問題——系統時間錯誤。在這種情況下,通過利用Windows時間服務器同步電腦時間,您可以輕松解決這個問題,并保證您的時間永遠準確無誤。    1、Windows時間服務器是什么 時間服務器是一種提供標準時間的服務器,可以讓一臺計算機(客戶端)連接并獲取網絡時間。 Windows 時間服務器系統可以將 UTC(世界...

Java與服務器同步時間的實現方法及注意事項

Java與服務器同步時間的實現方法及注意事項

  在服務器應用程序開發中,時間同步對于數據準確性、計算精度等方面都有至關重要的影響,確保服務器和客戶端時間的一致性是非常重要的。而在Java中,如何與服務器同步時間也是一個至關重要的問題,本文將從四個方面詳細闡述Java與服務器同步時間的實現方法及注意事項。    1、獲取服務器時間 Java通過網絡時間協議(NTP)獲取遠程時間,有許多第三方庫可以使用,如NTPClient、SNTP和JAVA NTP etc。其中,使用J...

ESXI服務器時間校準詳解

ESXI服務器時間校準詳解

  本文主要介紹ESXI服務器時間校準的詳解。時間對于我們的生活和工作都是至關重要,而服務器時間的準確性更是關系到系統穩定性和數據安全性。我們將從以下4個方面來介紹ESXI服務器時間校準:    1、NTP協議簡介 NTP(Network Time Protocol)即網絡時間協議,是一種用于同步計算機網絡中各個計算機的時間的協議。NTP的工作是客戶端向時間服務器發送時間請求,時間服務器返回時間信息,客戶端通過計算和校準自己的...

主站蜘蛛池模板: yjizz国产在线视频网 | 天天干天天爽天天操 | 久久久久久综合成人精品 | 久久伊人亚洲 | 亚洲欧洲第一页 | 国产高清久久 | 日本一区毛片免费观看 | 欧美一区二区三区在观看 | 欧美激情在线播放一区二区三区 | 国产麻豆精品 | 欧美日韩国产一区二区三区播放 | 999精品久久久中文字幕蜜桃 | 天天澡天天干 | 国产一区二区免费在线 | a在线免费 | 日韩毛片欧美一级a网站 | 在线看片福利 | 99久久综合狠狠综合久久一区 | 久久香蕉国产视频 | 亚洲日本va中文字幕婷婷 | 中文字幕综合网 | 久久网页 | 日本一二三不卡视频 | 日本精品在线 | 国产日韩欧美视频在线 | 久久国产免费观看 | 久久va | 国产第一页浮力影院-欢迎你 | 欧美色激情 | 精品国产免费久久久久久婷婷 | 国产在线观看一区二区三区四区 | 亚洲天堂资源网 | 按摩一级片 | 欧美日韩国产专区 | 蜜桃91丨九色丨蝌蚪 | 蜜桃视频免费在线观看 | 国产午夜精品久久久久九九 | 伊人久久大香线蕉综合爱婷婷 | 精品福利一区二区在线观看 | 欧美一级黄视频 | 一区二区三区亚洲视频 |