您的位置:首页 > 编程语言 > Qt开发

Qt实现NTP时钟同步

2014-03-18 14:12 411 查看


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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 qt