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

📄 nettime.cpp

📁 这是我写的一个从互联网上取得正确时间并设置本机时间的程序。只为学习希望多交流以后。
💻 CPP
字号:
// NetTime.cpp : Defines the entry point for the application.
//


#include "stdafx.h"
#include "resource.h"
#pragma comment(lib, "ws2_32.lib")

BOOL CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM);
int ShowPopupMenu(HWND,UINT,WPARAM,LPARAM);
WNDPROC EditProc;
int EditWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL AboutProc(HWND,UINT,WPARAM,LPARAM);
void EditPrintf(HWND,TCHAR*,...);
int FormatulTime(UINT,SYSTEMTIME&);
static HINSTANCE hInst;
static int iTmp=0;
static HWND hMain;

#define WM_NETTIMER (WM_USER+1)
#define ID_TIMER 1

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	hInst=hInstance;
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,(DLGPROC)MainProc);

	return 0;
}

BOOL CALLBACK MainProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	static char szIPAddr[]={"129.6.15.28"};
	static HWND hwndButton,hwndEdit;
	static SOCKET sock;
	static struct sockaddr_in sa;
	static TCHAR szOKLabel[32];
	hMain=hwnd;
	
	int iError,SOCK_ERROR;
	unsigned long ulTime;
	WORD wEvent,wError;
	WSADATA WSAData;

	switch (msg)
	{
	case WM_INITDIALOG:
		hwndButton=GetDlgItem(hwnd,IDOK);
		hwndEdit=GetDlgItem(hwnd,IDC_EDIT_INFO);
		HICON hIcon;
		hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON_CLOCK));
		SetClassLong(hwnd,GCL_HICON,(LONG)hIcon);
		RECT rTmp;
		GetClientRect(hwnd,&rTmp);
		SetWindowPos(hwnd,NULL,GetSystemMetrics(SM_CXSCREEN)/2-(rTmp.right-rTmp.left)/2,
					GetSystemMetrics(SM_CYSCREEN)/2-(rTmp.bottom-rTmp.top)/2,0,0,SWP_NOSIZE);
		EditProc=(WNDPROC)SetWindowLong(hwndEdit,GWL_WNDPROC,(LONG)EditWndProc);
		return 1;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case ID_MENU_QUIT:
			EndDialog(hwnd,0);
			return TRUE;
		case ID_MENU_ABOUT:
			DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG_ABOUT),hwnd,(DLGPROC)AboutProc);
			return TRUE;
		case IDOK:
		case IDC_BUTTON_SET:
		if(LOWORD(wParam)==IDC_BUTTON_SET)
			iTmp=2;
		if(LOWORD(wParam)==IDOK)
			iTmp=1;

			if(iError=WSAStartup(MAKEWORD(2,2),&WSAData))
			{
				EditPrintf(hwndEdit,"未能正确载入Socket模块#%i。\r\n",iError);
				WSACleanup();
				return TRUE;
			}
			sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
			if(sock==INVALID_SOCKET)
			{
				EditPrintf(hwnd,"创建Socket失败#%i\r\n",WSAGetLastError());
				WSACleanup();
				return TRUE;
			}
			
			if(SOCK_ERROR=WSAAsyncSelect(sock,hwnd,WM_NETTIMER,FD_CONNECT|FD_READ))
			{
				EditPrintf(hwndEdit,"非阻塞化失败#%i\r\n",WSAGetLastError());
				closesocket(sock);
				WSACleanup();
				return TRUE;
			}
		
			sa.sin_addr.S_un.S_addr=inet_addr(szIPAddr);
			sa.sin_port=htons(37);
			sa.sin_family=AF_INET;
			
			//bind(sock,(SOCKADDR*)&sa,sizeof(sa));
			connect(sock,(SOCKADDR *)&sa,sizeof(sa));

			if(WSAEWOULDBLOCK!=(iError=WSAGetLastError()))
			{
				EditPrintf(hwndEdit,"连接错误#%i\r\n",iError);
				closesocket(sock);
				WSACleanup();
				return TRUE;
			}
		if(LOWORD(wParam)==IDOK)
			EditPrintf(hwndEdit,"正在连接NIST Network Time Service\r\n");
	
						
			return 1;
		}
		return 0;

	case WM_NETTIMER:
		wEvent=WSAGETSELECTEVENT(lParam);
		wError=WSAGETSELECTERROR(lParam);
		switch(wEvent)
		{
		case FD_CONNECT:
			if(wError)
			{
				EditPrintf (hwndEdit, TEXT ("连 接error #%i.\r\n"), wError) ;
				return TRUE ;
			}
			iError=recv(sock,(char*)&ulTime,4,MSG_PEEK);
			return TRUE;
		case FD_READ:
			if(wError)
			{
				EditPrintf (hwndEdit, TEXT ("读 数 据error #%i.\r\n"), wError) ;
				return TRUE ;
			}
			iError=recv(sock,(char*)&ulTime,4,0);
			if(iError==SOCKET_ERROR)
			{
				EditPrintf (hwndEdit, TEXT ("读数据error #%i.\r\n"), WSAGetLastError()) ;
				return TRUE ;
			}
			ulTime=ntohl(ulTime);
			SYSTEMTIME stTime;
			FormatulTime(ulTime,stTime);
		if(iTmp==1)
			EditPrintf(hwndEdit,"NIST时间“%i-%i-%i %i:%i:%i”\r\n",stTime.wYear,stTime.wMonth,stTime.wDay,stTime.wHour,stTime.wMinute,stTime.wSecond);
		if(iTmp==2)
		{	
			SetSystemTime(&stTime);
			EditPrintf(hwndEdit,"根据NIST的标准校正了本计算机的时间\r\n");
		}
		
		return TRUE;
		}
		return TRUE;
	case WM_RBUTTONDOWN:
		ShowPopupMenu(hwnd,msg,wParam,lParam);		

		return TRUE;
	case WM_CLOSE:
		closesocket(sock);
		WSACleanup();
		EndDialog(hwnd,0);
		return 1;
	}	
	return 0;
}

void EditPrintf(HWND hwnd,TCHAR * szInfo,...)
{
	TCHAR szBuffer[1024];
	va_list pArgList;

	va_start(pArgList,szInfo);
	wvsprintf(szBuffer,szInfo,pArgList);
	va_end(pArgList);

	SendMessage(hwnd,EM_SETSEL,(WPARAM)-1,(LPARAM)-1);
	SendMessage(hwnd,EM_REPLACESEL,FALSE,(LPARAM)szBuffer);
	SendMessage(hwnd,EM_SCROLLCARET,0,0);

}

int FormatulTime(UINT ulTime,SYSTEMTIME &stTime)
{
	FILETIME ftNew;
	LARGE_INTEGER li;
	SYSTEMTIME stNew;

	stNew.wYear=1900;
	stNew.wMonth=1;
	stNew.wDay=1;
	if(iTmp==1)
	{
		stNew.wHour=8;
	}
	if(iTmp==2)
	{
		stNew.wHour=0;
	}
	stNew.wMinute=0;
	stNew.wSecond=0;
	stNew.wMilliseconds=0;

	SystemTimeToFileTime(&stNew,&ftNew);
	li=*(LARGE_INTEGER*)&ftNew;
	li.QuadPart+=(LONGLONG)10000000*ulTime;
	ftNew=*(FILETIME*)&li;
	FileTimeToSystemTime(&ftNew,&stTime);
	
	return 1;
}

int ShowPopupMenu(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	POINT pt;
	GetCursorPos(&pt);
	HMENU hMenuPopup,hMenu;
	hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU_MAIN));
	hMenuPopup=CreatePopupMenu();
	hMenuPopup=GetSubMenu(hMenu,0);
	TrackPopupMenu(hMenuPopup,0,pt.x,pt.y,0,hMain,0);
	DestroyMenu(hMenu);
	DestroyMenu(hMenuPopup);
	return TRUE;
}

int EditWndProc(HWND hwnd ,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg)
	{
	case WM_RBUTTONDOWN:
		ShowPopupMenu(hwnd,msg,wParam,lParam);
		return TRUE;
	}
	return CallWindowProc(EditProc,hwnd,msg,wParam,lParam);
}

BOOL AboutProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg)
	{

	case WM_CLOSE:
		EndDialog(hwnd,0);
		return TRUE;
	case WM_COMMAND:
		switch(wParam)
		{
		case IDOK:
			EndDialog(hwnd,0);
			return TRUE;
		}
		return FALSE;
		
	}
	return FALSE;
}

⌨️ 快捷键说明

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