VC++实现获取网络时间
生活随笔
收集整理的這篇文章主要介紹了
VC++实现获取网络时间
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
大家都知道Windows自帶同步網(wǎng)絡(luò)時(shí)間,我們來實(shí)現(xiàn)之
代碼如下
#include <winsock2.h> #pragma comment(lib, "WS2_32") // 鏈接到WS2_32.libclass CInitSock { public:CInitSock(BYTE minorVer = 2, BYTE majorVer = 2){// 初始化WS2_32.dllWSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(::WSAStartup(sockVersion, &wsaData) != 0){exit(0);}}~CInitSock(){ ::WSACleanup(); } };#include "InitSock.h" #include <stdio.h> CInitSock initSock; void SetTimeFromTP(ULONG ulTime) // 根據(jù)時(shí)間協(xié)議返回的時(shí)間設(shè)置系統(tǒng)時(shí)間 {// Windows文件時(shí)間是一個(gè)64位的值,它是從1601年1月1日中午12:00到現(xiàn)在的時(shí)間間隔,// 單位是1/1000 0000秒,即1000萬(wàn)分之1秒(100-nanosecond )FILETIME ft;SYSTEMTIME st;// 首先將基準(zhǔn)時(shí)間(1900年1月1日0點(diǎn)0分0秒0毫秒)轉(zhuǎn)化為Windows文件時(shí)間 st.wYear = 1900;st.wMonth = 1;st.wDay = 1;st.wHour = 0;st.wMinute = 0;st.wSecond = 0;st.wMilliseconds = 0;SystemTimeToFileTime(&st, &ft);// 然后將Time Protocol使用的基準(zhǔn)時(shí)間加上以及逝去的時(shí)間,即ulTimeLONGLONG *pLLong = (LONGLONG *)&ft;// 注意,文件時(shí)間單位是1/1000 0000秒,即1000萬(wàn)分之1秒(100-nanosecond )*pLLong += (LONGLONG)10000000 * ulTime; // 再將時(shí)間轉(zhuǎn)化回來,更新系統(tǒng)時(shí)間FileTimeToSystemTime(&ft, &st); SetSystemTime(&st); }int main() {SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf(" Failed socket() \n");return 0;}// 填寫遠(yuǎn)程地址信息,連接到時(shí)間服務(wù)器sockaddr_in servAddr; servAddr.sin_family = AF_INET;servAddr.sin_port = htons(37); // 這里使用的時(shí)間服務(wù)器是129.132.2.21,更多地址請(qǐng)參考http://tf.nist.gov/service/its.htmservAddr.sin_addr.S_un.S_addr = inet_addr("129.132.2.21");if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1){printf(" Failed connect() \n");return 0;}// 等待接收時(shí)間協(xié)議返回的時(shí)間。學(xué)習(xí)了Winsock I/O模型之后,最好使用異步I/O,以便設(shè)置超時(shí)ULONG ulTime = 0;int nRecv = ::recv(s, (char*)&ulTime, sizeof(ulTime), 0);if(nRecv > 0){ulTime = ntohl(ulTime);SetTimeFromTP(ulTime);printf(" 成功與時(shí)間服務(wù)器的時(shí)間同步!\n");}else{printf(" 時(shí)間服務(wù)器不能確定當(dāng)前時(shí)間!\n");}::closesocket(s);return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/new0801/archive/2012/09/04/6177716.html
總結(jié)
以上是生活随笔為你收集整理的VC++实现获取网络时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由验证下载服务器性能得到的启示
- 下一篇: HP刀片机远程https安装RedHat