Qt实现NTP时钟同步



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);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值