NTP时间校准

// TimeSyn.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <WinSock.h>
#include <TIME.H>
#pragma comment (lib,"Ws2_32")

struct   NTP_Packet
{
    int      Control_Word;
    int      root_delay;
    int      root_dispersion;
    int      reference_identifier;
    __int64    reference_timestamp;
    __int64 originate_timestamp;
    __int64 receive_timestamp;
    int      transmit_timestamp_seconds;
    int      transmit_timestamp_fractions;
};

/************************************************************************/
/* 函数说明:自动与时间服务器同步更新
/* 参数说明:无
/* 返 回 值:成功返回TRUE,失败返回FALSE
/************************************************************************/
BOOL UpdateSysTime()
{
    // 国内常用NTP服务器地址及IP
    // https://www.douban.com/note/171309770/
    WORD    wVersionRequested;
    WSADATA wsaData;

    // 初始化版本
    wVersionRequested = MAKEWORD( 1, 1 );
    if (0!=WSAStartup(wVersionRequested, &wsaData))
    {
        WSACleanup();
        return FALSE;
    }
    if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
    {
        WSACleanup( );
        return FALSE;
    }

    // 这个IP是中国大陆时间同步服务器地址,可自行修改
    SOCKET soc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    struct sockaddr_in addrSrv;

    // ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
    addrSrv.sin_addr.S_un.S_addr=inet_addr("202.120.2.101");
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(123);

    NTP_Packet NTP_Send,NTP_Recv;
    NTP_Send.Control_Word   =   htonl(0x0B000000);
    NTP_Send.root_delay        =   0;
    NTP_Send.root_dispersion   =   0;
    NTP_Send.reference_identifier    =   0;
    NTP_Send.reference_timestamp    =   0;
    NTP_Send.originate_timestamp    =   0;
    NTP_Send.receive_timestamp        =   0;
    NTP_Send.transmit_timestamp_seconds        =   0;
    NTP_Send.transmit_timestamp_fractions   =   0; 

    if(SOCKET_ERROR==sendto(soc,(const char*)&NTP_Send,sizeof(NTP_Send),
        0,(struct sockaddr*)&addrSrv,sizeof(addrSrv)))
    {
        closesocket(soc);
        return FALSE;
    }
    int sockaddr_Size =sizeof(addrSrv);
    if(SOCKET_ERROR==recvfrom(soc,(char*)&NTP_Recv,sizeof(NTP_Recv),
        0,(struct sockaddr*)&addrSrv,&sockaddr_Size))
    {
        closesocket(soc);
        return FALSE;
    }
    closesocket(soc);
    WSACleanup();

    SYSTEMTIME    newtime;
    float        Splitseconds;
    struct        tm    *lpLocalTime;
    time_t        ntp_time;

    // 获取时间服务器的时间
    ntp_time    = ntohl(NTP_Recv.transmit_timestamp_seconds)-2208988800;
    lpLocalTime = localtime(&ntp_time);
    if(lpLocalTime == NULL)
    {
        return FALSE;
    }

    // 获取新的时间
    newtime.wYear      =lpLocalTime->tm_year+1900;
    newtime.wMonth     =lpLocalTime->tm_mon+1;
    newtime.wDayOfWeek =lpLocalTime->tm_wday;
    newtime.wDay       =lpLocalTime->tm_mday;
    newtime.wHour      =lpLocalTime->tm_hour;
    newtime.wMinute    =lpLocalTime->tm_min;
    newtime.wSecond    =lpLocalTime->tm_sec;

    // 设置时间精度
    Splitseconds=(float)ntohl(NTP_Recv.transmit_timestamp_fractions);
    Splitseconds=(float)0.000000000200 * Splitseconds;
    Splitseconds=(float)1000.0 * Splitseconds;
    newtime.wMilliseconds   =   (unsigned   short)Splitseconds;

    // 修改本机系统时间
    SetLocalTime(&newtime);
    return TRUE;
}

int main(int argc, char* argv[])
{
    UpdateSysTime();
    return 0;
}

转自:http://blog.csdn.net/wangningyu/article/details/4522648#

时间: 2025-01-17 21:12:39

NTP时间校准的相关文章

CentOS7 配置ntp时间校准

vi  /etc/crontab 0 5 * * * root /usr/sbin/ntpdate  pool.ntp.org && /sbin/hwclock -w systemctl  enable  ntpd.service systemctl  start   ntpd.service pgrep  ntpd

Centos6系列搭建NTP时间服务器

NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms. NTP官方站点:http://www.ntp.org/ ,NTP服务基于C/S(Client/Server)架构,每台机器既可以是NTPserver,也可以为NTPclient. 在linux中有两种查看系统时间的方法: date        #查看系

NTP时间服务器

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授. NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间,看多方便. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,

NTP时间服务器搭建及配置

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授.其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms. NTP服务的安装 [[email protected] ~]# yum install ntp [

linux ntp时间服务器配置

Network Time Protocol (NTP) 也是RHCE新增的考试要求. 学习的时候也顺便复习了一下如何设置Linux的时间,现在拿出来和大家分享 设置NTP服务器不难但是NTP本身是一个很复杂的协议. 这里只是简要地介绍一下实践方法和上次一样,下面的实验都在RHEL5上运行 1. 时间和时区 如果有人问你说现在几点? 你看了看表回答他说晚上8点了. 这样回答看上去没有什么问题,但是如果问你的这个人在欧洲的话那么你的回答就会让他很疑惑,因为他那里还太阳当空呢. 这里就有产生了一个如何

Centos 6.3 下实现ntp时间服务器

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授. NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间,看多方便. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,

Windows Server 2008 R2 NTP时间服务器配置

WindowsServer 2008 R2 NTP时间服务器配置 在Windows Server 2008 R2 中用Windows Time(W32Time)service 建一个SNTP/NTP服务器为Windows或非windows客户端提供时间服务. 1.在开始菜单栏中,点击"运行"输入regedit,打开Windows注册表 2.设定成为NTP服务器类型. 修改登陆档案中:"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Se

开源软件包的安装及ntp时间服务器简析

linux 系统服务篇(-)一.NTP时间服务器 network time protocol    NTP服务器的使命:使局域网内服务器(或个人pc端)的时间保持一致.二.开源软件的使用步骤:    1.安装软件服务.        (1)源码方式安装            下载,解压源码(wegt 或 rz (我用CRT)tar xf)            分析安装平台  ./configure(一般是测试软件的安装环境,看缺少哪些必要的依赖安装包)            编译软件     

Linux之NTP时间服务器配置部署

[前言] 在计算机的世界里,时间同步对于计算机间的相互协调合作无比重要,在我们实现高可用集群.负载均衡.DNS服务等等都需要时间同步.NTP(Network Time Protocol,网络时间协议)就是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms. [实验拓扑] [配置步骤] NTP服务端配置 Linux系统内核本身内置提供了对NTP的支持,为此我们只需要再安装NT