源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-09-10 20:02 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:c语言实现系统时间校正工具代码分享
[u]复制代码[/u] 代码如下:
//******************************************************************* //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; }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部