久久精品亚洲欧美日韩精品中文字幕 _日本久久二区_99精品美女视频在线观看热舞_精品国产一区二区精华

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

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

  使用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服務器重啟后時間錯誤的問題。    1、系統時間問題 系統時間問題是導致Linux服務器重啟后時間錯誤的一大原因。當服務器重啟后,系統時間往往會被重置為標準時間,導致時...

H3C NTP時間服務器配置步驟與注意事項

H3C NTP時間服務器配置步驟與注意事項

  本文將為您介紹H3C NTP時間服務器的配置方法及注意事項。通過以下四個方面的詳細闡述,您將了解如何在H3C設備上配置NTP時間服務器,并且注意到在進行配置時的一些要點。    1、NTP時間服務器的基本概念 NTP(Network Time Protocol)是一種網絡協議,用于將計算機的時鐘同步到一個可以被認可的標準。NTP時間服務器則是提供這種服務的服務器。NTP時間服務器可以確保各個計算機在同一時刻采用相同的時間標...

Linux服務器時間同步及管理方式

Linux服務器時間同步及管理方式

  文章簡述:    Linux服務器時間同步及管理方式 時間作為一種基礎信息,對于服務器的管理和運維來說是至關重要的。Linux系統提供了多種時間同步和管理方式,本文將從以下4個方面進行詳細闡述。    1、時間同步方式 時間同步是指在多個Linux服務器之間,使它們的時間保持一致。在Linux系統中,我們可以使用多種方...

「如何正確設置DSS200服務器的時間」

「如何正確設置DSS200服務器的時間」

  如何正確設置DSS200服務器的時間,是許多使用該設備的用戶經常遇到的問題。正確的時間設置不僅能保證數據的準確性,還有助于提高工作效率。本文將從硬件時間同步、操作系統時間同步、網絡時間同步和常見問題答疑四個方面詳細闡述如何正確設置DSS200服務器的時間。    1、硬件時間同步 硬件時間同步是設置DSS200服務器時間的第一步。在進行操作系統或網絡時間同步前,需要先設置硬件時間。...

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

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

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

IE瀏覽器時間與服務器時間不同,如何解決?

IE瀏覽器時間與服務器時間不同,如何解決?

  文章概述   本文將闡述IE瀏覽器時間與服務器時間不同的問題以及如何解決這個問題。我們將從以下四個方面詳細闡述:1、什么是IE瀏覽器時間和服務器時間;2、IE瀏覽器時間和服務器時間不同的原因;3、如何檢測IE瀏覽器時間和服務器時間是否相同;4、如何解決IE瀏覽器時間和服務器時間不同的問題。通過本文,你將能夠充分了解IE瀏覽器時間和服務器時間的差異,以及如何解決這個問題。   什么是IE瀏覽器時間和服務器時間?   IE瀏覽器時...

Linux服務器時間無法修改的解決方案

Linux服務器時間無法修改的解決方案

  Linux服務器是一種開放源代碼的操作系統,其穩定性和安全性得到了廣泛認可。然而,有些用戶在使用Linux服務器時可能會遇到時間無法修改的問題,這使得服務器上的時間無法經過校準。在本文中,我們將從四個方面探討Linux服務器時間無法修改的原因及解決方案。    1、硬件時鐘電池可能需要更換 硬件時鐘電池是一種用于存儲服務器時間的裝置。如果硬件時鐘電池電量不足,或者已經過期,那么Linux服務器將無法對時間進行正確的校準。因...

Dell原廠服務器服務時間統計及保障措施

Dell原廠服務器服務時間統計及保障措施

  本文主要圍繞"Dell原廠服務器服務時間統計及保障措施"展開,探究Dell在保障客戶服務時間方面的措施及具體實施情況。全文主要分為四個部分,在廣度和深度上進行了充分的探討,以期為讀者提供全面且實用的參考。    1、服務時間的定義 在正式了解Dell的服務時間統計和保障措施之前,有必要先明確服務時間的概念。服務時間通常是指企業為客戶或用戶提供服務的時間范圍,其中包括正常工作時間、節假日、下班時間等,這是...

Dell服務器熱線:隨時解答你的技術困惑

Dell服務器熱線:隨時解答你的技術困惑

  隨著信息時代的到來,數據的存儲和計算需求越來越大,服務器作為數據中心的核心設備,對于企業的運營和發展具有至關重要的意義。然而,對于許多企業來說,服務器的運營和維護是個不小的挑戰。在這樣的情況下,Dell服務器熱線的出現無疑為企業的服務器運營帶來了福音。作為Dell官方的服務渠道,Dell服務器熱線時刻準備回答你的技術困惑,解決你的系統問題,為企業的信息化建設提供全方位的技術支持,下面我們將分別從哪些方面對Dell服務器熱線進行詳細闡述。   ...

Cisco AD時間服務器:時鐘同步精準可靠

Cisco AD時間服務器:時鐘同步精準可靠

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

Linux服務器超時時間優化技巧

Linux服務器超時時間優化技巧

  超時時間是一個服務的重要參數,特別是在 Linux 服務器運維中,超時時間的設置直接影響到系統的穩定性和可靠性。本文將從四個方面,為大家詳細闡述如何優化 Linux 服務器的超時時間,保障系統的高效運行。    1、TCP 超時時間優化 TCP 超時時間是指當一個連接閑置一段時間后,內核就會發送一個探測數據包來檢測對端是否還存活。探測次數達到一定數量時,連接將被認為是失效的,從而發起關閉操作。Linux 內核默認的 TCP...

FF14一區服務器開放時間及特色介紹,快來了解各服務器的魅力!

FF14一區服務器開放時間及特色介紹,快來了解各服務器的魅力!

  FF14是一款受歡迎的多人在線游戲,在線游戲需要服務器的支持,每個服務器有不同的開放時間和特色。本文將從四個方面介紹FF14一區服務器的開放時間及特色,讓你了解各服務器的魅力!    1、服務器開放時間 FF14一區服務器的開放時間是每天的10:00AM-2:00AM。這給玩家們提供了充足的時間玩耍,也方便了不同地區和時區的玩家們。尤其是在周末和節假日期間,服務器開放時間更長,讓玩家們有更多的時間來游戲。...

Linux系統時間同步服務器地址推薦

Linux系統時間同步服務器地址推薦

  在Linux系統中,時間同步服務器地址是十分重要的一項配置。為了確保系統時鐘與其他時間相關任務的準確性,我們需要在系統中配置默認的時間同步服務器地址。但是,由于互聯網上存在大量的NTP(網絡時間協議)服務器,而不是所有的時間服務器地址都能夠為我們的網絡提供穩定可靠的時間同步服務。因此,本文將會從以下四個方面對Linux系統時間同步服務器地址的推薦進行詳細的闡述,幫助您配置一個更為準確可靠的時間同步服務器地址。    1、時鐘的重要性...

FIFA19UT服務器停機維護公告:游戲暫停服務,將于近日恢復!

FIFA19UT服務器停機維護公告:游戲暫停服務,將于近日恢復!

  本文將圍繞"FIFA19UT服務器停機維護公告:游戲暫停服務,將于近日恢復!"這一話題展開,從游戲停機維護的必要性、影響、維護原因以及維護后的改進措施入手,做出詳細的闡述,并最終對全文進行總結歸納。    1、游戲停機維護的必要性 在線游戲服務的停機維護是一項必要的措施,其目的是增強游戲的穩定性,提升游戲質量。游戲停機維護使開發商可以在游戲停機期間進行服務器的修復、維護或升級,從而減少游戲因服務器故障而...

「修改服務器時間的licence管理」

「修改服務器時間的licence管理」

  在現代數字化市場中,許多軟件以及應用程序都被施加了許可證(licence)管理系統。但是,一個常見的問題是如何有效的保護軟件的安全性和合法使用。有人可能會嘗試修改服務器的時間來繞過licence系統。因此,本篇文章將從以下四個方面對「修改服務器時間的licence管理」進行詳細闡述。    1、licence管理的基礎知識 在深入了解修改服務器時間的licence管理之前,我們需要清楚licence管理的基礎知識。lice...

久久精品亚洲欧美日韩精品中文字幕 _日本久久二区_99精品美女视频在线观看热舞_精品国产一区二区精华
亚洲一二三区精品| 欧美激情性爽国产精品17p| 一区免费观看| 亚洲成色www8888| 欧美日韩成人精品| 欧美一级视频精品观看| 精品69视频一区二区三区| 欧美视频在线播放| 国产精品久久久久9999吃药| 欧美伊人精品成人久久综合97| 国内精品久久久久影院优| 欧美国产日本| 欧美一区在线直播| 亚洲一本视频| 亚洲综合三区| 亚洲欧美成人| 亚洲午夜国产一区99re久久| 日韩视频一区二区| 一区二区三区不卡视频在线观看| 亚洲乱码国产乱码精品精| 激情欧美一区二区三区| 亚洲高清不卡在线观看| 国产欧美va欧美va香蕉在| 亚洲精华国产欧美| 国产日韩欧美精品综合| 国产精品日韩欧美| 久久久久久久久久看片| 一区二区久久久久| 亚洲视频久久| 久久久99精品免费观看不卡| 欧美成人午夜激情在线| 欧美日韩国产色综合一二三四 | 国产精品一卡| 国产午夜精品一区二区三区欧美| 黄色成人精品网站| 欧美日韩一区综合| 欧美成人精品在线视频| 欧美国产精品一区| 欧美片第1页综合| 欧美激情第4页| 欧美精品一区在线发布| 欧美三级网页| 国产女主播视频一区二区| 国产真实久久| 亚洲国产你懂的| 黄色一区二区在线观看| 99热精品在线| 久久综合网hezyo| 国产目拍亚洲精品99久久精品| 亚洲第一中文字幕| 久久成人久久爱| 久久久久9999亚洲精品| 欧美精品亚洲一区二区在线播放| 国产精品男人爽免费视频1| 免费观看久久久4p| 欧美精品一区二区蜜臀亚洲| 国产原创一区二区| 99国产精品一区| 久久av老司机精品网站导航| 久久美女性网| 国产一区二区三区av电影| 性久久久久久久久久久久| 欧美午夜在线观看| 亚洲日本中文字幕免费在线不卡| 久久精品日产第一区二区三区| 欧美三日本三级少妇三2023| 亚洲人体一区| 欧美成人精品高清在线播放| 国产精品久久波多野结衣| 在线观看精品| 欧美主播一区二区三区美女 久久精品人 | 国产精品久久一区主播| 久久av最新网址| 亚洲欧洲日本专区| 国产欧美日韩精品一区| 猛干欧美女孩| 亚洲欧美国产va在线影院| 激情五月综合色婷婷一区二区| 欧美日本国产一区| 欧美一区亚洲二区| 亚洲免费观看高清在线观看 | 欧美a一区二区| 亚洲影院免费观看| 亚洲国产日韩欧美在线动漫| 国产精品无码专区在线观看 | 久久人人97超碰精品888| 日韩视频永久免费| 韩国v欧美v日本v亚洲v| 欧美性天天影院| 另类图片国产| 香蕉亚洲视频| 一区二区久久久久| 亚洲丁香婷深爱综合| 国产精品自拍网站| 欧美精品在线免费观看| 久久精品一区二区国产| 亚洲午夜精品一区二区| 亚洲人被黑人高潮完整版| 国产精品一区二区久久久| 欧美久久久久久久久| 久久九九国产| 亚洲欧美另类在线| 99国产精品99久久久久久| 一区精品久久| 国产亚洲福利社区一区| 国产精品mm| 欧美连裤袜在线视频| 久久午夜羞羞影院免费观看| 亚洲欧美成人| 这里只有精品丝袜| 亚洲精品孕妇| 亚洲国产精品一区二区第一页| 国产一区欧美日韩| 国产精品视频男人的天堂| 欧美日韩在线三区| 欧美激情区在线播放| 麻豆av一区二区三区| 久久久久久久97| 欧美亚洲一区二区三区| 亚洲男人第一av网站| 一区二区三区不卡视频在线观看| 亚洲精品你懂的| 亚洲国产美女久久久久| 在线成人黄色| 激情综合激情| 国内精品嫩模av私拍在线观看| 国产欧美日本一区二区三区| 国产精品久久久久av免费| 欧美日韩一区二区在线| 欧美日韩高清区| 欧美日本国产精品| 欧美精品一区三区| 欧美精品久久久久久久| 欧美成人免费大片| 农村妇女精品| 欧美国产日韩免费| 欧美大片在线影院| 欧美精品一卡| 欧美日韩国产一区精品一区| 欧美精品在线免费| 欧美日韩国产另类不卡| 欧美日韩国产区| 欧美日韩精品一区视频 | 欧美激情导航| 欧美日韩第一区日日骚| 欧美日韩国产一级片| 欧美日韩国产成人| 欧美视频在线观看 亚洲欧| 欧美午夜精品久久久久久孕妇| 欧美三级在线| 国产精品蜜臀在线观看| 国产欧美精品在线播放| 国产视频精品免费播放| 狠狠久久婷婷| 亚洲国产精品成人久久综合一区| 亚洲国产高清aⅴ视频| 亚洲精品免费看| 一区二区电影免费观看| 亚洲一区二区三区高清 | 日韩视频一区二区| 亚洲视频在线观看三级| 亚洲综合精品四区| 欧美自拍偷拍午夜视频| 久久婷婷影院| 欧美精品一区二区三区很污很色的| 欧美日韩p片| 国产精品美女主播| 海角社区69精品视频| 亚洲国产裸拍裸体视频在线观看乱了| 最近中文字幕mv在线一区二区三区四区 | 午夜精品久久久久久久久久久久 | 国产精品高清在线观看| 国产色综合天天综合网| 亚洲丰满在线| 99在线观看免费视频精品观看| 一区二区欧美视频| 性亚洲最疯狂xxxx高清| 老司机精品视频网站| 欧美日韩精品系列| 国产日产欧产精品推荐色| 在线视频成人| 在线亚洲美日韩| 久久精品99久久香蕉国产色戒| 欧美va天堂| 欧美亚洲成人精品| 国内精品嫩模av私拍在线观看| 亚洲精品网站在线播放gif| 亚洲欧美一区二区三区久久| 久久天天躁狠狠躁夜夜爽蜜月| 欧美黑人一区二区三区| 国产精品女同互慰在线看| 亚洲第一二三四五区| 国产精品99久久久久久久久 | 亚洲一区3d动漫同人无遮挡| 久久精品99久久香蕉国产色戒| 欧美激情中文字幕在线| 国产精品久久久久久久久久尿| 一区二区视频在线观看| 在线亚洲精品| 卡通动漫国产精品| 国产精品毛片a∨一区二区三区| 伊人久久亚洲影院| 亚洲婷婷在线| 老牛嫩草一区二区三区日本|