三年成全免费看全视频,欧美国产日产图区综合,日韩10000免费拍拍拍,人与动人物av片欧美

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

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

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

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

標簽: 時頻百科

相關文章

Gom引擎服務器啟動時間優化方案探討

Gom引擎服務器啟動時間優化方案探討

  Gom引擎是目前市場上比較流行的游戲引擎之一,但是啟動時間一直是它的一大短板。因此,本文將圍繞"Gom引擎服務器啟動時間優化方案探討"這一主題展開,從多個方面進行詳細闡述,希望能為大家帶來實用的經驗。    1、服務器配置的優化 服務器的配置對于啟動時間的影響至關重要。如何優化服務器的配置,成為了我們探討的第一個方面。   一方面,我們可以選擇更強大的服務器硬件...

《堅守服務器防沉迷時間,保障游戲健康》

《堅守服務器防沉迷時間,保障游戲健康》

  本文主要探討《堅守服務器防沉迷時間,保障游戲健康》的重要性以及實施該措施的影響,旨在引起年輕玩家和游戲廠商的關注,全力打造綠色游戲環境。    1、保障游戲玩家健康 隨著網絡游戲的發展,越來越多的年輕玩家會花費過多的時間在游戲中,導致身體和心理問題的出現。《堅守服務器防沉迷時間,保障游戲健康》的實施,限制未成年玩家每天游戲時間,在保障游戲體驗的同時也減少了玩家沉迷游戲的風險。而且該措施也提醒家長和學校要關注未成年人游戲時間...

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

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

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

Java實現獲取一周時間為中心的服務器數據

Java實現獲取一周時間為中心的服務器數據

  Java實現獲取一周時間為中心的服務器數據是一種常見的編程方法,它可以幫助開發者快速獲取服務器數據,并以一周時間為中心來進行數據的整理和展示。本文將從四個方面來詳細講解Java實現獲取一周時間為中心的服務器數據的方法和注意事項,希望能為Java開發者提供一些幫助。    1、獲取服務器數據 獲取服務器數據是Java實現獲取一周時間為中心的服務器數據的第一步。在Java中,我們可以使用httpURLConnection或者H...

Dell服務器預計發貨時間查詢方法大全

Dell服務器預計發貨時間查詢方法大全

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

Linux服務器永久更改時間的方法

Linux服務器永久更改時間的方法

  Linux服務器是目前廣泛使用的服務器操作系統之一,它的穩定性、安全性和靈活性得到了廣泛的認可。然而,有時候服務器的時間可能會與實際時間不一致,這樣就會影響到一些關鍵的操作。針對這個問題,本篇文章將詳細介紹Linux服務器如何永久更改時間的方法,使服務器的時間能夠精確、穩定地顯示。    1、通過date命令更改系統時間 date命令是Linux服務器中比較常用的命令之一,它可以更改系統時間。為了永久更改時間,需要先設置時...

Google時間服務器IP:網絡時間同步的穩定之選

Google時間服務器IP:網絡時間同步的穩定之選

  Google時間服務器IP:網絡時間同步的穩定之選,網絡時間同步對于網絡的正常運行至關重要,而一個可靠的時間服務器則是保證網絡時間同步穩定的關鍵所在。在眾多時間服務器中,Google的時間服務器IP因其高穩定性和優質的服務備受青睞,成為網絡時間同步的穩定之選。    1、Google時間服務器IP的概述 Google 時間服務器 IP 是 216.239.32.15,以及 216.239.32.16-19 四個 IP 地址...

《時光倒流 六度啟示》

《時光倒流 六度啟示》

  《時光倒流 六度啟示》是一本由美國哲學家史蒂文·約翰遜所著的科普讀物。本書通過介紹人類與時間、空間、交往等方面的關系,闡述了“六度分隔理論”,即每個人和另一個人之間最多只需要通過五個中間人聯系起來。作者希望通過這本書,讓讀者了解人際關系的奧妙,了解自己和身邊人之間的聯系。    1、時間與空間的探究 本書首先介紹了時間和空間對人類聯系的影響。作者通過具體的例子,講述了不同的時間和空間距離對人際關系的影響,如時差、固化空間等...

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

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

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

《戰火連天,傾城出擊》——一戰傾城什么時間開服啟新篇章!

《戰火連天,傾城出擊》——一戰傾城什么時間開服啟新篇章!

  本文將為大家詳細介紹《戰火連天,傾城出擊》——一戰傾城什么時間開服啟新篇章。這是一款以第一次世界大戰為背景的多人在線戰爭游戲,該游戲自發布之日起便備受關注,尤其是在游戲內增加更多功能和新流程之后,如今更是備受玩家們的熱捧和期待。在本文中,我們將從四個方面分別詳細闡述這款游戲將在什么時間啟動新篇章。    1、游戲版本更新時間 《戰火連天,傾城出擊》自發布之后,一直積極更新,加入了更多的游戲流程、劇情故事和升級功能。這些更新...

2020年最新時間同步服務器IP地址大全

2020年最新時間同步服務器IP地址大全

  2020年最新時間同步服務器IP地址大全是網絡世界中時間同步的重要組成部分。本文將就這一話題,分別從不同的方面對其做詳細闡述。    一、時間同步服務器IP地址的定義 時間同步服務器IP地址,又稱NTP服務器IP地址,是指一種能夠讓網絡中計算機的時間同步的服務器地址,通過連接這種服務器,就能夠保證計算機的時間精準無誤,服務于人們的日常工作和生活。   NTP服務器IP地址大全是存儲...

NTP服務器校準工具,簡單易用的時間同步軟件

NTP服務器校準工具,簡單易用的時間同步軟件

  本文主要圍繞NTP服務器校準工具和簡單易用的時間同步軟件展開討論。通過對這些工具的詳細分析,讀者能夠全面了解這些工具的特點和優劣勢。本文主要從以下四個方面進行闡述:1、NTP服務器校準工具的作用和使用方法;2、簡單易用的時間同步軟件的特點和使用場景;3、NTP服務器校準工具和簡單易用的時間同步軟件的比較;4、對這些工具進行總結歸納,指導用戶如何選擇適合自己的工具。    1、NTP服務器校準工具的作用和使用方法 NTP服務...

KSOA服務器時間不同步問題的解決方案

KSOA服務器時間不同步問題的解決方案

  文章概要:本文主要探討KSOA服務器時間不同步問題的解決方案。主要圍繞同步時間、時間格式、網絡時鐘同步等方向展開闡述。首先,解釋時間同步的重要性。其次,分別探討時間同步方式、不同的時間格式對同步的影響。最后,深入探討網絡時鐘同步機制的實現、優缺點,為KSOA服務器時間同步提供參考。通過本文的全面分析,可以為KSOA服務器時間同步問題的解決提供有益的啟示。    1、時間同步的重要性 時間同步是計算機系統中的關鍵問題之一,尤...

C語言搭建網絡時間服務器:詳細實現步驟與注意事項

C語言搭建網絡時間服務器:詳細實現步驟與注意事項

  本文將為大家講解如何使用C語言搭建網絡時間服務器,我們將依次介紹網絡時間服務器的基本概念,具體實現步驟,注意事項以及如何測試。通過本文,你將學習如何使用C語言編寫網絡時間服務器,為學習網絡編程提供基礎知識和實踐經驗。    1、網絡時間服務器基本概念 網絡時間協議(NTP)是一種協議,用于同步網絡上的各個計算機的時間。它使用UDP協議來傳輸消息。NTP的工作方式是選定一個服務器作為主服務器,該服務器與其他服務器進行通信,使...

MC服務器關閉時是否會扣除游戲時間?

MC服務器關閉時是否會扣除游戲時間?

  在玩Minecraft(以下簡稱MC)游戲時,很多玩家會遇到一些問題,其中之一就是在玩游戲時,MC服務器突然關閉了,那么這種情況下會不會扣除游戲時間呢?本文將從4個方面進行詳細解答。    1、MC服務器關閉前是否給出提示 首先要明確的是,MC服務器關閉時是否會扣除游戲時間,要看服務器關閉的原因。如何才能知道服務器即將關閉呢?一般來說,服務器會事先給出提示。例如,常見的一些提示有:...

    1. <bdo id="4f8wn"></bdo>
    2. <bdo id="4f8wn"></bdo><p id="4f8wn"><dl id="4f8wn"><dd id="4f8wn"></dd></dl></p>
      <center id="4f8wn"></center>
      1. 主站蜘蛛池模板: 宣武区| 东山县| 金沙县| 霸州市| 禹城市| 建水县| 湟中县| 盐源县| 湘乡市| 曲周县| 临澧县| 财经| 滨州市| 论坛| 穆棱市| 钟祥市| 呈贡县| 乐安县| 平顶山市| 贵德县| 朝阳县| 常熟市| 潜山县| 锡林浩特市| 龙里县| 南安市| 同德县| 乐安县| 长顺县| 河西区| 霞浦县| 叙永县| 牙克石市| 石景山区| 巴彦淖尔市| 杨浦区| 扬州市| 庆阳市| 定西市| 南昌县| 南投市|

        可以介绍下你们的产品么?

        你们是怎么收费的呢?

        现在有优惠活动么?

        请您留言

        感谢您的关注,当前客服人员不在线,请填写一下您的信息,我们会尽快和您联系。

        提交