⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 time.cpp

📁 Wince网络时间同步程序。功能为将终端本地时间与网络上某台服务器的时间同步。
💻 CPP
字号:
// time.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#include <stdio.h>
#include <stdlib.h>
//#include <iostream.h>
#include <TCHAR.H>
#include <winsock.h>
#pragma comment (lib,"Ws2")


//#define UNICODE
//#define _UNICODE

#define _countof(array) (sizeof(array)/sizeof(array[0]))
#define HIGHTIME		21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime
#define LOWTIME			4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime

//using namespace std;

//NTP服务器列表
struct NISTSVR{
	int     key;	//编号
	in_addr addr;	//IP地址
    LPCTSTR IPinfo;
	LPCTSTR server;	//域名
	LPCTSTR info;	//信息
} NISTSVRSARY[] = {
	{ 0, {0,0,0,0}, NULL, NULL},
	{ 1, {129,6,15,28},_T("129.6.15.28"), _T("time-a.nist.gov"),_T("NIST,盖士堡,马里兰州") },
	{ 2, {129,6,15,29}, _T("129.6.15.29"),_T("time-b.nist.gov"),_T("NIST,盖士堡,马里兰州") },
	{ 3, {132,163,4,101},_T("132.163.4.101"), _T("time-a.timefreq.bldrdoc.gov"),_T("NIST,博耳德市,科罗拉多州") },
	{ 4, {132,163,4,102}, _T("132.163.4.102"),_T("time-b.timefreq.bldrdoc.gov"),_T("NIST,博耳德市,科罗拉多州") },
	{ 5, {132,163,4,103}, _T("132.163.4.103"),_T("time-c.timefreq.bldrdoc.gov"),_T("NIST,博耳德市,科罗拉多州") },
	{ 6, {128,138,140,44},_T("128.138.140.44"), _T("tutcnist.colorado.edu"),_T("科罗拉多大学,博耳德市") },
	{ 7, {192,43,244,18}, _T("192.43.244.18"),_T("time.nist.gov"),_T("NCAR,博耳德市,科罗拉多州") },
	{ 8, {131,107,1,10}, _T("131.107.1.10"),_T("time-nw.nist.gov"),_T("Microsoft,雷蒙德,华盛顿州") },
	{ 9, {208,184,49,129},_T("208.184.49.129"), _T("nist1.nyc.certifiedtime.com"),_T("纽约市") },
};

//所选择的NTP服务器
static int choice = 0;

void usage()
{
	wprintf( L"\n\t-----网络时间同步程序 V1.00 ------\n" );
	wprintf( L"\t  长城信息产业股份有限公司  版权所有 @2005   \n" );
	wprintf( L"\t----------------------------------------------\n\n" );

	int l = _countof(NISTSVRSARY);
	for (int i= 1; i< l; i++){
		wprintf(L"%d.域名:%s IP:[%s] %s\n", NISTSVRSARY[i].key, NISTSVRSARY[i].server, 
			NISTSVRSARY[i].IPinfo, NISTSVRSARY[i].info);
	}
}

BOOL UpdateSysTime(DWORD dwTime)
{
	UINT64 uiCurTime, uiBaseTime, uiResult;
	SYSTEMTIME st;

	uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;

	uiCurTime = (UINT64)dwTime * (UINT64)10000000;
	uiResult = uiBaseTime + uiCurTime;

	FileTimeToSystemTime((LPFILETIME)&uiResult, &st);
	
	return SetSystemTime(&st);
}

BOOL GetTimeFromServer(DWORD *lpdwTime)
{
	*lpdwTime = 0;
	BOOL bReturn= FALSE;

	SOCKET sSock = socket(AF_INET, SOCK_STREAM, 0);
	if(INVALID_SOCKET != sSock)
	{
		struct sockaddr_in sin;

		memcpy(&sin.sin_addr, &NISTSVRSARY[choice].addr, sizeof(in_addr));
		sin.sin_family = AF_INET;
		sin.sin_port = htons(IPPORT_TIMESERVER);
	
		wprintf( L"\n    ...等待连接中 ...\n");

		if(0 == connect(sSock, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)))
		{
			wprintf( L"  已经跟时间服务器建立连接.接收数据中...   \n");
			int iResult, iRead;

			for(iRead = 0; iRead < 4; iRead += iResult)
			{
				iResult = recv(sSock, (char*)lpdwTime + iRead, 4 - iRead, 0);
				if(iResult < 1)
					break;
			}

			if(4 == iRead)
			{
				*lpdwTime = ntohl(*lpdwTime);

				bReturn = TRUE;
			}else
				wprintf( L" 获取时间数据失败 !\n");
		}else
			wprintf( L" 连接超时,与服务器建立连接失败! \n");


		closesocket(sSock);
	}

	return bReturn;
}


int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
 	// TODO: Place code here.
	int argc=0;

	WSADATA WSAData;
	if(WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
	{
           wprintf(L"初始化链接库失败.\n");
           WSACleanup();
           exit(1);
    }

  if(argc<2)
	{
		usage();
		wprintf(L"        请选择一台时间服务器,输入相应数字(1-9之间).\n");

		scanf("%d",&choice);
		while (choice <= 0 || choice > 9)
		{
			wprintf(L"        输入错误,重新输入!输入相应数字(1-9之间).\n");
			scanf("%d",&choice);

		}
	}
  //else 
	//	choice = atoi(&argv[1][strlen(argv[1])-1]);
	
	DWORD dwTime;
	//取服务器时间
	if (GetTimeFromServer(&dwTime))
	{
		//更新系统时间
		if (UpdateSysTime(dwTime))
		{
			wprintf( L"    与服务器同步时间成功.\n");
		}else{
			wprintf( L"    更新本要系统时间失败!\n");
		}
	}

	WSACleanup();
		wprintf( L"    按任意键退出程序!\n");

	getchar();
	getchar();
	return 0;

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -