socket学习(二)

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 }
原文地址:https://www.cnblogs.com/Clin/p/2788340.html