c语言 程序延时 校准,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

#include

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<

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<

return0;

}

//等待接收时间协议返回,最好使用异步IO,以便设置超时

ULONGulTime=0;

intiRecv=recv(s,(char*)&ulTime,sizeof(ulTime),0);

if(iRecv>0)

{

ulTime=ntohl(ulTime);

SetTimeFromTP(ulTime);

cout<

}

else

{

cout<

}

shutdown(s,SD_RECEIVE);

closesocket(s);

WSACleanup();

return0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值