视频链接:http://www.rupeng.com/forum/thread-1236-1-2.html
网络授时服务,同步本机时间,主要代码:
#include "stdafx.h"
#include <windows.h>#include <windowsx.h>
#include <winsock2.h>
#include "Resource.h"
#include "MainDlg.h"
#define HIGHTIME 21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime
#define LOWTIME 4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}
return FALSE;
}
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
{
SocketTest();
}
break;
default:
break;
}
}
void SocketTest()
{
WSADATA wsaData;
//初始化Socket库
WSAStartup(MAKEWORD(2,0),&wsaData);
//创建一根电线
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
//设置电线连接服务器端的端口
sa.sin_port = htons(IPPORT_TIMESERVER);
//123.125.50.135是ping smtp.163.com出来的,后面会讲使用gethostbyname来直接从
//主机名得到ip地址
sa.sin_addr.S_un.S_addr = inet_addr("128.138.140.44");
//为什么不用设置客户端的端口,难道不需要客户端的端口吗?
if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
{
ShowError();
return;
}
unsigned long ulTime=0;
//接收时间服务器返回的消息
recv(sock,(char *)&ulTime,sizeof(unsigned long),0);
ulTime = ntohl(ulTime);
//MessageBox(NULL,buff,TEXT("返回消息"),MB_OK);
SYSTEMTIME st;
UINT64 uiCurTime, uiBaseTime, uiResult;
uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
uiCurTime = (UINT64)ulTime * (UINT64)10000000;
uiResult = uiBaseTime + uiCurTime;
FileTimeToSystemTime((LPFILETIME)&uiResult, &st);
TCHAR buff[256];
ZeroMemory(buff,sizeof(buff)/sizeof(TCHAR));
wsprintf(buff,TEXT("%i年%i月%i日 %i:%i:%i"),st.wYear,st.wMonth,st.wDay,st.wHour+8,st.wMinute,st.wSecond);
MessageBox(NULL,buff,TEXT(""),MB_OK);
SetSystemTime(&st);
//做事情。把大象放冰箱总共分几步
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,"",MB_ICONERROR);
}
void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}
注意:
要改变本机时间必须以管理员身份运行程序。
总结:
看完这节,我们可以对网络授时功能有个大致的了解。有些东西视频里说的也不一定是对的,特别是这些很早之前录的视频,视频里的一些东西可能过时了。在实践的过程中,我们要发现并解决那些问题,才能得到提高。