Qt实现NTP时钟同步
2014-03-18 14:12
411 查看
#include "ui_tttt.h"
#include <QHostInfo>
#include <QDateTime>
#include <QAudioFormat>
//#include <winsock2.h>
tttt::tttt(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::tttt)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushbutton_clicked()));
}
tttt::~tttt()
{
delete ui;
}
void tttt::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void tttt::on_pushbutton_clicked()
{
QHostInfo info=QHostInfo::fromName("time.windows.com");
QString ipAddress=info.addresses().first().toString();
udpsocket=new QUdpSocket(this);
connect(udpsocket,SIGNAL(connected()),this,SLOT(connectsucess()));
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(readingDataGrams()));
udpsocket->connectToHost("time.windows.com",123);
}
void tttt::connectsucess()
{
ui->pushButton->setEnabled(false);
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()));
ui->label->setText("Connected");
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;
//40到43字节保存原始时间戳,即客户端发送的时间
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->flush();
udpsocket->write(timeRequest);
udpsocket->flush();
}
void tttt::readingDataGrams()
{
ui->label->setText("Reading...");
QByteArray newTime;
QDateTime Epoch(QDate(1900, 1, 1));
QDateTime unixStart(QDate(1970, 1, 1));
do
{
newTime.resize(udpsocket->pendingDatagramSize());
udpsocket->read(newTime.data(), newTime.size());
}while(udpsocket->hasPendingDatagrams());
QByteArray TransmitTimeStamp ;
TransmitTimeStamp=newTime.right(8);
quint32 seconds=TransmitTimeStamp[0];
quint8 temp=0;
for(int j=1;j<=3;j++)
{
seconds=seconds<<8;
temp=TransmitTimeStamp[j];
seconds=seconds+temp;
}
QDateTime time;
time.setTime_t(seconds-Epoch.secsTo(unixStart));
ui->textEdit->append(time.toString());
this->udpsocket->disconnectFromHost();
this->udpsocket->close();
ui->pushButton->setEnabled(true);
}
QT 写的从网络NTP 服务器获得网络时间的方法(4)
#include "tttt.h"#include "ui_tttt.h"
#include <QHostInfo>
#include <QDateTime>
#include <QAudioFormat>
//#include <winsock2.h>
tttt::tttt(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::tttt)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushbutton_clicked()));
}
tttt::~tttt()
{
delete ui;
}
void tttt::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void tttt::on_pushbutton_clicked()
{
QHostInfo info=QHostInfo::fromName("time.windows.com");
QString ipAddress=info.addresses().first().toString();
udpsocket=new QUdpSocket(this);
connect(udpsocket,SIGNAL(connected()),this,SLOT(connectsucess()));
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(readingDataGrams()));
udpsocket->connectToHost("time.windows.com",123);
}
void tttt::connectsucess()
{
ui->pushButton->setEnabled(false);
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()));
ui->label->setText("Connected");
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;
//40到43字节保存原始时间戳,即客户端发送的时间
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->flush();
udpsocket->write(timeRequest);
udpsocket->flush();
}
void tttt::readingDataGrams()
{
ui->label->setText("Reading...");
QByteArray newTime;
QDateTime Epoch(QDate(1900, 1, 1));
QDateTime unixStart(QDate(1970, 1, 1));
do
{
newTime.resize(udpsocket->pendingDatagramSize());
udpsocket->read(newTime.data(), newTime.size());
}while(udpsocket->hasPendingDatagrams());
QByteArray TransmitTimeStamp ;
TransmitTimeStamp=newTime.right(8);
quint32 seconds=TransmitTimeStamp[0];
quint8 temp=0;
for(int j=1;j<=3;j++)
{
seconds=seconds<<8;
temp=TransmitTimeStamp[j];
seconds=seconds+temp;
}
QDateTime time;
time.setTime_t(seconds-Epoch.secsTo(unixStart));
ui->textEdit->append(time.toString());
this->udpsocket->disconnectFromHost();
this->udpsocket->close();
ui->pushButton->setEnabled(true);
}
相关文章推荐
- 转载:基于NTP的高精度时钟同步系统实现_电子技术应用
- 模拟NTP协议实现时钟同步
- 内网配置NTP时钟同步
- 设置ntp时钟同步
- Windows server 2012 NTP配置,实现成员服务器及客户端时间与域控制器时间同步
- 搭建NTP服务器实现时钟同步
- Linux 使用 NTP 时钟同步
- linux debian下配置ntp时钟同步
- [原]NTP时钟同步服务设置
- 通过 NTP 进行时钟同步
- ntp时钟同步的建立过程
- Qt专题一:时钟的多种实现方式
- 【iOS Clock Synchronization】iOS时钟同步:基于NTP协议的开源项目ios-ntp
- NTP协议网络时间同步 ios中应用 实现秒杀倒计时
- 在FREEBSD上用NTP同步设备时钟
- Qt之实现表针时钟小工具
- 用QT实现同步调用WebService
- CentOS6.5下实现时间同步的 ntp 服务的配置
- ntp时钟同步
- 从ruby实现时间服务器ntp同步功能也谈“逆向工程”