#include <windowsx.h>
#include <winsock2.h>
#define HIGHTIME 21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime
#define LOWTIME 4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime
void WinSocket()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData);//初始化Socket库,“2,0”为版本号。
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//套接字,即连接线。
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(IPPORT_TIMESERVER);//设置连接服务器端端口
sa.sin_addr.S_un.S_addr = inet_addr(“210.72.145.8”);//ping www.time.ac.cn
//客户端端口动态分配、自动生成。
if(connect(sock, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
{
ShowError();
return;
}
//
// Add code here
//
unsigned long ulTime;
//接收时间消息
recv(sock, (char*)&ulTime, sizeof(unsigned long), 0);
ulTime = ntohl(ulTime);//从网络字节顺序转换为主机字节顺序
SYSTEMTIME st;
UINT64 uiCurTime, uiBaseTime, uiResult;
uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
uiCurTime = (UINT64)ulTime * (UINT64)10000000;
uiResult = uiBaseTime + uiCurTime;
FileTimeToSystemTime((LPFILETIME)&uiResult, &st);
TCHAR cBuffer[256];
ZeroMemory(cBuffer, sizeof(cBuffer));
wsprintf(cBuffer, TEXT(“当前准确时间为:%d年%d月%d日 %d时:%d分:%d秒”), st.wYear, st.wMonth, st.wDay, st.wHour+8, st.wMinute, st.wSecond);
//由于授时服务器返回的是格林尼治时间,中国在东八区,故st.wHour+8。
MessageBox(NULL, cBuffer, “准确时间”, MB_OK);
SetSystemTime(&st);
MessageBox(NULL, TEXT(“授时成功”), TEXT(“授时成功”), MB_OK);
closesocket(sock);
WSACleanup();
}
void ShowError()
{
TCHAR* lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |//自动分配消息缓冲区
FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息
NULL, GetLastError(), //获取错误信息标识
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //使用系统缺省语言
(LPTSTR)&lpMsgBuf, //消息缓冲区
0, NULL);
MessageBox(NULL, lpMsgBuf, TEXT(“错误信息”), MB_ICONERROR);
}
可能会因缺少MSVCIRTD.DLL文件报错,将该文件下载并放入WINDOWS/system32文件夹下即可。