c语言实现系统时间校正工具代码分享_C语言教程-查字典教程网
c语言实现系统时间校正工具代码分享
c语言实现系统时间校正工具代码分享
发布时间:2016-12-28 来源:查字典编辑
摘要:复制代码代码如下://***********************************************************...

复制代码 代码如下:

//*******************************************************************

//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语言学习
    编程开发子分类