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++中的STL常用算法之遍历算法详解

    C++中的STL常用算法之遍历算法详解

    这篇文章主要介绍了C++中的STL常用算法之遍历算法详解,ransform() 可以将函数应用到容器的元素上,并将这个函数返回的值保存到另一个容器中,它返回的迭代器指向输出容器所保存的最后一个元素的下一个位置,需要的朋友可以参考下
    2023-12-12
  • VS2019开发Linux C++程序的实现步骤

    VS2019开发Linux C++程序的实现步骤

    由于很多unix特有的函数无法在Windows上使用,而Vim又用的不太顺手,突然想到最初用vs的时候有一个基于Linux的C++开发。本文就来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • C语言实现随机抽奖程序

    C语言实现随机抽奖程序

    这篇文章主要为大家详细介绍了C语言实现随机抽奖程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • c++ 解决无法打印uint8_t 类型变量的问题

    c++ 解决无法打印uint8_t 类型变量的问题

    这篇文章主要介绍了c++ 解决无法打印uint8_t 类型变量的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • QT编写地图实现获取区域边界

    QT编写地图实现获取区域边界

    区域边界是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同。本文将具体介绍QT在编写地图时如何实现获取区域边界,需要的可以参考一下
    2022-01-01
  • 算法之排序算法的算法思想和使用场景总结

    算法之排序算法的算法思想和使用场景总结

    这篇文章主要介绍了算法之排序算法的算法思想和使用场景总结,本文讲解了插入排序、交换排序、选择排序等几大类排序算法的特点、思想和使用场景,需要的朋友可以参考下
    2014-08-08
  • 深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下
    2013-05-05
  • 详解C++设计模式编程中策略模式的优缺点及实现

    详解C++设计模式编程中策略模式的优缺点及实现

    这篇文章主要介绍了C++设计模式编程中策略模式的优缺点及实现,文中讨论了策略模式中设计抽象接口的继承和组合之间的区别,需要的朋友可以参考下
    2016-03-03
  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    这篇文章介绍了C++中declspec(dllexport)和declspec(dllimport) 的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • cocos2dx-3.10 C++实现滚动数字

    cocos2dx-3.10 C++实现滚动数字

    这篇文章主要为大家详细介绍了cocos2dx-3.10 C++实现滚动数字效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09

最新评论