c语言实现系统时间校正工具代码分享

 更新时间:2014年01月24日 15:54:31   作者:  
这篇文章主要介绍了c语言实现系统时间校正工具,大家参考使用吧

复制代码 代码如下:

//*******************************************************************
//Time Protocol是一种非常简单的应用层协议。它返回一个未格式化的32位二进制数字,
 //这个数字描述了从1900年1月1日午夜到现在的秒数。服务器在端口37监听协议请求,以
 //TCP/IP或者UDP/IP格式返回响应。将服务器的返回值转化为本地时间是客户端程序的责任。
 //这里使用的时间服务器是129.132.2.21,更多的服务器地址在“http://tf.nist.gov/service/time-servers.html
 //网站列出。
 //*******************************************************************

#include<iostream>
#include<WinSock2.h>

usingnamespacestd;

#pragmacomment(lib,"ws2_32")

voidSetTimeFromTP(ULONGulTime)
{
//Windows文件时间是一个64位的值,它是从1601年1月1日中午12:00到现在的时间间隔,
//单位是1/10000000秒,即1000万分之1秒
FILETIMEft;
SYSTEMTIMEst;

st.wYear=1900;
st.wMonth=1;
st.wDay=1;
st.wHour=0;
st.wMinute=0;
st.wSecond=0;
st.wMilliseconds=0;

SystemTimeToFileTime(&st,&ft);
//然后将TimeProtocol使用的基准时间加上已经逝去的时间,即ulTime
LONGLONG*pllLong=(PLONGLONG)&ft;
//注意文件时间单位是1/10000000秒,即1000万分之1秒
*pllLong+=(LONGLONG)10000000*ulTime;
//再将时间转化回来,更新系统时间
FileTimeToSystemTime(&ft,&st);
SetSystemTime(&st);
}

intmain(intargc,char**argv)
{
WSADATAwsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);

SOCKETs=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==s)
{
cout<<"socketerror:"<<GetLastError()<<endl;
return0;
}

SOCKADDR_INservAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_port=htons(37);
servAddr.sin_addr.S_un.S_addr=inet_addr("129.132.2.21");

if(-1==connect(s,(PSOCKADDR)&servAddr,sizeof(servAddr)))
{
cout<<"connecterror:"<<WSAGetLastError()<<endl;
return0;
}

//等待接收时间协议返回,最好使用异步IO,以便设置超时
ULONGulTime=0;
intiRecv=recv(s,(char*)&ulTime,sizeof(ulTime),0);
if(iRecv>0)
{
ulTime=ntohl(ulTime);
SetTimeFromTP(ulTime);
cout<<"成功与服务器时间同步!"<<endl;
}
else
{
cout<<"时间服务器不能确定当前时间!"<<endl;
}

shutdown(s,SD_RECEIVE);
closesocket(s);

WSACleanup();
return0;
}

相关文章

  • C++实现特殊矩阵的压缩存储算法

    C++实现特殊矩阵的压缩存储算法

    在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵。本文将利用C++实现特殊矩阵的压缩存储,感兴趣的可以了解一下
    2022-08-08
  • C++使用MFC获取PC硬件配置信息

    C++使用MFC获取PC硬件配置信息

    这篇文章主要为大家详细介绍了C++使用MFC获取PC硬件配置信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • C语言数据结构图的创建与遍历实验示例

    C语言数据结构图的创建与遍历实验示例

    这篇文章主要为大家介绍了C语言数据结构图的创建与遍历实验示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • C++11标准库 互斥锁 <mutex> 详解

    C++11标准库 互斥锁 <mutex> 详解

    这篇文章主要介绍了C++11标准库互斥锁 <mutex> 的相关知识,使用call_once()的时候,需要一个once_flag作为call_once()的传入参数,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-07-07
  • MFC设置对话框焦点的方法简述

    MFC设置对话框焦点的方法简述

    这篇文章主要介绍了MFC设置对话框焦点的方法简述,主要讲述了两种实现方法,需要的朋友可以参考下
    2014-10-10
  • C++中Semaphore内核对象用法实例

    C++中Semaphore内核对象用法实例

    这篇文章主要介绍了C++中Semaphore内核对象用法实例,有助于深入了解信号量(Semaphore)的基本用法,需要的朋友可以参考下
    2014-10-10
  • 举例分析private的作用(c/c++学习)

    举例分析private的作用(c/c++学习)

    我知道我们可以用 public 中的值,把private中的数据给提出来,但是还是搞不懂private该怎么用,或者说在一个具体程序中,private有什么用
    2020-08-08
  • 基于C++实现一个日期计算器

    基于C++实现一个日期计算器

    这篇文章主要为大家详细介绍了如何利用C++实现一个简单的日期计算器,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-10-10
  • 详解如何使用openssl创建自签名证书

    详解如何使用openssl创建自签名证书

    这篇文章主要为大家介绍了详解如何使用openssl创建自签名证书示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 使用VC6.0对C语言程序进行调试的基本手段分享

    使用VC6.0对C语言程序进行调试的基本手段分享

    这篇文章主要介绍了用VC6.0开发c语言程序的时候调试代码的一些小技巧,需要的朋友可以参考下
    2013-07-07

最新评论