1.授时服务器
utcnist.colorado.edu(IP:128.138.140.44)
stdtime.gov.hk(IP:210.0.235.14)
2.网络字节序和本机字节序的转换
htons:把unsigned short类型从主机序转换到网络序
htonl:把unsigned long类型从主机序转换到网络序
ntohs:把unsigned short类型从网络序转换到主机序
ntohl:把unsigned long类型从网络序转换到主机序
3.授时服务器返回的事格林尼治时间,中国是东8区。
4.相关代码:
1 #define HIGHTIME 21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime 2 #define LOWTIME 4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime 3 void DoSocket() 4 { 5 WSADATA wsaData; 6 WSAStartup(MAKEWORD(2, 0), &wsaData); 7 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 8 SOCKADDR_IN sa; 9 sa.sin_family = AF_INET; 10 11 sa.sin_port = htons(IPPORT_TIMESERVER); 12 //utcnist.colorado.edu(IP:128.138.140.44) 13 //stdtime.gov.hk(IP:210.0.235.14) 14 sa.sin_addr.S_un.S_addr = inet_addr("128.138.140.44"); 15 if (connect(sock, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) 16 { 17 ShowError(); 18 return; 19 } 20 21 unsigned long ulTime = 0; 22 recv(sock, (char *)&ulTime, sizeof(unsigned long), 0); 23 24 ulTime = ntohl(ulTime);//注意网络与本机的字节序转换 25 26 SYSTEMTIME st; 27 UINT64 uiCurTime, uiBaseTime, uiResult; 28 uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME; 29 uiCurTime = (UINT64)ulTime * (UINT64)10000000; 30 uiResult = uiBaseTime + uiCurTime; 31 FileTimeToSystemTime((LPFILETIME)&uiResult, &st); 32 33 TCHAR buff[256]; 34 ZeroMemory(buff, sizeof(buff) / sizeof(TCHAR)); 35 wsprintf(buff, TEXT("%i年%i月%i日 %i:%i:%i"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 36 MessageBox(NULL, buff, "", 0); 37 38 closesocket(sock); 39 WSACleanup(); 40 } 41 42 void ShowError() 43 { 44 TCHAR* lpMsgBuf; 45 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| 46 FORMAT_MESSAGE_FROM_SYSTEM, 47 NULL, GetLastError(), 48 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 49 (LPTSTR)&lpMsgBuf, 50 0, 51 NULL); 52 MessageBox(NULL, lpMsgBuf, "", MB_ICONERROR); 53 }