c語(yǔ)言實(shí)現(xiàn)系統(tǒng)時(shí)間校正工具代碼分享
//*******************************************************************
//Time Protocol是一種非常簡(jiǎn)單的應(yīng)用層協(xié)議。它返回一個(gè)未格式化的32位二進(jìn)制數(shù)字,
//這個(gè)數(shù)字描述了從1900年1月1日午夜到現(xiàn)在的秒數(shù)。服務(wù)器在端口37監(jiān)聽協(xié)議請(qǐng)求,以
//TCP/IP或者UDP/IP格式返回響應(yīng)。將服務(wù)器的返回值轉(zhuǎn)化為本地時(shí)間是客戶端程序的責(zé)任。
//這里使用的時(shí)間服務(wù)器是129.132.2.21,更多的服務(wù)器地址在“http://tf.nist.gov/service/time-servers.html
//網(wǎng)站列出。
//*******************************************************************
#include<iostream>
#include<WinSock2.h>
usingnamespacestd;
#pragmacomment(lib,"ws2_32")
voidSetTimeFromTP(ULONGulTime)
{
//Windows文件時(shí)間是一個(gè)64位的值,它是從1601年1月1日中午12:00到現(xiàn)在的時(shí)間間隔,
//單位是1/10000000秒,即1000萬(wàn)分之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使用的基準(zhǔn)時(shí)間加上已經(jīng)逝去的時(shí)間,即ulTime
LONGLONG*pllLong=(PLONGLONG)&ft;
//注意文件時(shí)間單位是1/10000000秒,即1000萬(wàn)分之1秒
*pllLong+=(LONGLONG)10000000*ulTime;
//再將時(shí)間轉(zhuǎn)化回來(lái),更新系統(tǒng)時(shí)間
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;
}
//等待接收時(shí)間協(xié)議返回,最好使用異步IO,以便設(shè)置超時(shí)
ULONGulTime=0;
intiRecv=recv(s,(char*)&ulTime,sizeof(ulTime),0);
if(iRecv>0)
{
ulTime=ntohl(ulTime);
SetTimeFromTP(ulTime);
cout<<"成功與服務(wù)器時(shí)間同步!"<<endl;
}
else
{
cout<<"時(shí)間服務(wù)器不能確定當(dāng)前時(shí)間!"<<endl;
}
shutdown(s,SD_RECEIVE);
closesocket(s);
WSACleanup();
return0;
}
相關(guān)文章
C++實(shí)現(xiàn)特殊矩陣的壓縮存儲(chǔ)算法
在實(shí)際存儲(chǔ)時(shí),會(huì)發(fā)現(xiàn)矩陣中有許多值相同的數(shù)據(jù)或有許多零數(shù)據(jù),且分布呈現(xiàn)出一定的規(guī)律,稱這類型的矩陣為特殊矩陣。本文將利用C++實(shí)現(xiàn)特殊矩陣的壓縮存儲(chǔ),感興趣的可以了解一下2022-08-08
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
C++11標(biāo)準(zhǔn)庫(kù) 互斥鎖 <mutex> 詳解
這篇文章主要介紹了C++11標(biāo)準(zhǔn)庫(kù)互斥鎖 <mutex> 的相關(guān)知識(shí),使用call_once()的時(shí)候,需要一個(gè)once_flag作為call_once()的傳入?yún)?shù),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-07-07
MFC設(shè)置對(duì)話框焦點(diǎn)的方法簡(jiǎn)述
這篇文章主要介紹了MFC設(shè)置對(duì)話框焦點(diǎn)的方法簡(jiǎn)述,主要講述了兩種實(shí)現(xiàn)方法,需要的朋友可以參考下2014-10-10
C++中Semaphore內(nèi)核對(duì)象用法實(shí)例
這篇文章主要介紹了C++中Semaphore內(nèi)核對(duì)象用法實(shí)例,有助于深入了解信號(hào)量(Semaphore)的基本用法,需要的朋友可以參考下2014-10-10
舉例分析private的作用(c/c++學(xué)習(xí))
我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來(lái),但是還是搞不懂private該怎么用,或者說(shuō)在一個(gè)具體程序中,private有什么用2020-08-08
基于C++實(shí)現(xiàn)一個(gè)日期計(jì)算器
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的日期計(jì)算器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-10-10
使用VC6.0對(duì)C語(yǔ)言程序進(jìn)行調(diào)試的基本手段分享
這篇文章主要介紹了用VC6.0開發(fā)c語(yǔ)言程序的時(shí)候調(diào)試代碼的一些小技巧,需要的朋友可以參考下2013-07-07

