Qt怎么实现NTP服务器时间同步
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容主要讲解"Qt怎么实现NTP服务器时间同步",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt怎么实现NTP服务器时间同步"吧!一、前言很多软件都有
千家信息网最后更新 2025年02月01日Qt怎么实现NTP服务器时间同步
本篇内容主要讲解"Qt怎么实现NTP服务器时间同步",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt怎么实现NTP服务器时间同步"吧!
一、前言
很多软件都有时间同步的功能,尤其是Qt在嵌入式设备上的,有时候还有很多是没有UI界面的程序,而硬件上有个时钟,时间久了难免没有电,需要从服务器来同步时间来保证本地的时间是正确的,不然本地记录的一些日志的时间都是不正确的,很多还可能是1970年的。 NTP同步时间是个标准的协议,使用的端口是123端口,这个端口很牛逼,居然霸占了123这个端口,碉堡!使用NTP服务同步时间,需要设置个时间服务器IP地址,这个地址可以网上找到很多的,微软自带的那个有时候行有时候不行,因为默认用的UDP协议,所以是不可靠的,有丢包的可能,建议选择一些国内的时间服务器,比如一些大学的时间服务器,还是比较准确可靠的。
二、代码思路
NtpClient::NtpClient(QObject *parent) : QObject(parent){ ntpIP = "202.120.2.101"; udpSocket = new QUdpSocket(this); connect(udpSocket, SIGNAL(connected()), this, SLOT(sendData())); connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readData()));}void NtpClient::sendData(){ qint8 LI = 0; qint8 VN = 3; qint8 MODE = 3; qint8 STRATUM = 0; qint8 POLL = 4; qint8 PREC = -6; QDateTime epoch(QDate(1900, 1, 1)); qint32 second = quint32(epoch.secsTo(QDateTime::currentDateTime())); qint32 temp = 0; QByteArray timeRequest(48, 0); timeRequest[0] = (LI << 6) | (VN << 3) | (MODE); timeRequest[1] = STRATUM; timeRequest[2] = POLL; timeRequest[3] = PREC & 0xff; timeRequest[5] = 1; timeRequest[9] = 1; timeRequest[40] = (temp = (second & 0xff000000) >> 24); temp = 0; timeRequest[41] = (temp = (second & 0x00ff0000) >> 16); temp = 0; timeRequest[42] = (temp = (second & 0x0000ff00) >> 8); temp = 0; timeRequest[43] = ((second & 0x000000ff)); udpSocket->write(timeRequest);}void NtpClient::readData(){ QByteArray newTime; QDateTime epoch(QDate(1900, 1, 1)); QDateTime unixStart(QDate(1970, 1, 1)); while (udpSocket->hasPendingDatagrams()) { newTime.resize(udpSocket->pendingDatagramSize()); udpSocket->read(newTime.data(), newTime.size()); }; QByteArray transmitTimeStamp ; transmitTimeStamp = newTime.right(8); quint32 seconds = transmitTimeStamp.at(0); quint8 temp = 0; for (int i = 1; i <= 3; i++) { seconds = (seconds << 8); temp = transmitTimeStamp.at(i); seconds = seconds + temp; } QDateTime dateTime; dateTime.setTime_t(seconds - epoch.secsTo(unixStart));#ifdef __arm__#ifdef arma9 dateTime = dateTime.addSecs(60 * 60 * 8);#endif#endif udpSocket->disconnectFromHost(); //有些时候返回的数据可能有误或者解析不正确,导致填充的时间不正确 if (dateTime.isValid()) { emit receiveTime(dateTime); }}void NtpClient::setNtpIP(const QString &ntpIP){ if (this->ntpIP != ntpIP) { this->ntpIP = ntpIP; }}void NtpClient::getDateTime(){ udpSocket->abort(); udpSocket->connectToHost(ntpIP, 123);}
三、效果图
到此,相信大家对"Qt怎么实现NTP服务器时间同步"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
时间
服务
服务器
同步
端口
有时候
内容
地址
学习
不行
实用
更深
代码
兴趣
前言
功能
大学
实用性
实际
嵌入式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全神曲《江湖》
lol服务器推荐
美国软件开发总监月薪多少
手机控制汽车app软件开发
数据库的合规检查
设备服务器的管理方式有哪些
网络安全运营服务培训
江苏服务器回收公司哪里有
大型关系型数据库如何分库
vpn服务器手机
网络安全特征包括哪些
关于调整网络安全领导小组的通知
数据库应用技术a卷
北京靠谱的电脑服务器回收
网络安全和法律专业就业前景
网络安全实验学年总结
三级数据库可以切换吗
最新的网络安全的书籍
搭建数据库费用最底
查看数据库系统支持的存储引擎
软件开发专业的分析
名扬多媒体服务器
魔兽网络安全任务怎么做
网络安全去 要树立正确的
山西电力网络安全三产单位
服务器双路主板装机图文
pg数据库怎么查询所有表名
浙江崛起网络技术公司
测试工程师网络安全案例学习心得
科创软件开发研究所