欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

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

来源:本站原创|时间:2020-01-10|栏目: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++中指针和引用的区别分析

本文标题:c语言实现系统时间校正工具代码分享

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3814.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有