// SetNewTime - sets system time // Return value - TRUE if successful, FALSE otherwise // hour - new hour (0-23) // minutes - new minutes (0-59)BOOL SetNewTime(WORD hour, WORD minutes) { SYSTEMTIME st; char *pc; GetSystemTime(&st); // gets current time st.wHour = hour; // adjusts hours st.wMinute = minutes; // and minutes if (!SetSystemTime(&st)) // sets system time return FALSE; return TRUE; }你可以通过SOKCET 从服务器上获得新的时间,然后设置本机的时间,这只是一个简单的SOKCET程序而已。
// Return value - TRUE if successful, FALSE otherwise
// hour - new hour (0-23)
// minutes - new minutes (0-59)BOOL SetNewTime(WORD hour, WORD minutes)
{
SYSTEMTIME st;
char *pc; GetSystemTime(&st); // gets current time
st.wHour = hour; // adjusts hours
st.wMinute = minutes; // and minutes
if (!SetSystemTime(&st)) // sets system time
return FALSE;
return TRUE;
}你可以通过SOKCET 从服务器上获得新的时间,然后设置本机的时间,这只是一个简单的SOKCET程序而已。
/* sntpc.c */
/* SNTP僋儔僀傾儞僩 */
/* (C) Copyright 1997 By Tomoaki Nakashima. All right reserved. */
/*--------------------------------------------------------------------------*/#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <time.h>#define BUFSIZE 256 /* 僶僢僼傽僒僀僘 */
#define RECVSIZE 4096 /* 庴怣僶僢僼傽僒僀僘 */
#define TIMEOUT 3 /* 僞僀儉傾僂僩昩悢 */struct NTP_Packet{ /* NTP僷働僢僩 */
int Control_Word;
int root_delay;
int root_dispersion;
int reference_identifier;
__int64 reference_timestamp;
__int64 originate_timestamp;
__int64 receive_timestamp;
int transmit_timestamp_seconds;
int transmit_timestamp_fractions;
};int main(int argc,char **argv)
{ WORD wVersionRequested;
int nErrorStatus;
WSADATA wsaData;
char svName[BUFSIZE]; /* 僒乕僶偺僪儊僀儞柤 */
unsigned short port = 123; /* 僒乕僶偺億乕僩斣崋 */
unsigned short local_port = 1024; /* 庴怣偡傞億乕僩斣崋 */
int soc; /* 僜働僢僩乮Soket Descriptor乯 */
unsigned long serveraddr; /* 僒乕僶偺IP傾僪儗僗 */
struct hostent *serverhostent; /* 僒乕僶偺忣曬傪巜偡億僀儞僞 */
struct sockaddr_in sockname; /* 僜働僢僩偺傾僪儗僗 */
struct sockaddr_in serversockaddr; /* 僒乕僶偺傾僪儗僗 */
int sockaddr_Size; /* 僒乕僶偺傾僪儗僗偺僒僀僘 */
struct NTP_Packet NTP_Send; /* 憲怣偡傞NTP僷働僢僩 */
struct NTP_Packet NTP_Recv; /* 庴怣偡傞NTP僷働僢僩 */
fd_set rdps;
struct timeval waittime;
int selret; time_t Cur_time; /* 儘乕僇儖儅僔儞偺帪崗 */
time_t ntp_time; /* NTP僒乕僶偐傜庢摼偟偨帪崗 */
struct tm *lpNewLocalTime; /* 尰抧帪崗偵曄姺偟偨NTP僒乕僶偺帪崗 */
SYSTEMTIME Timecall; /* 儘乕僇儖儅僔儞偵愝掕偡傞帪崗 */
float Splitseconds; BOOL sync_flag; /* 摨婜僼儔僌 */
char *p,*r,*t,wk[8]; /* 嶌嬈梡椞堟 */
/* 堷悢偑側偄応崌偼堷悢偺愢柧傪昞帵偡傞 */
if(argc < 2){
fprintf(stderr,"sntpc NTPServer [-S]\n");
return -1;
} /* 堷悢偺NTP僒乕僶柤傪峊偊傞 */
strcpy(svName,argv[1]);
/* 僒乕僶柤偵億乕僩斣崋偑巜掕偟偰偁傟偽丄暘妱偡傞 */
for(p = svName;*p != ':' && *p != '\0';p++);
if(*p == ':'){
for(t = p + 1,r = wk;*t != '\0';t++,r++){
*r = *t;
}
*r = '\0';
port = (unsigned short)atoi(wk); *p = '\0';
} /* -s 僗僀僢僠偑巜掕偝傟偰偄傟偽摨婜僼儔僌傪棫偰傞 */
if(argc == 3 && stricmp(argv[2],"-s") == 0){
sync_flag = TRUE;
}else{
sync_flag = FALSE;
} /*----------------------------------------------------------*/
/* NTP僒乕僶偐傜帪崗傪庢摼偡傞 */
/*----------------------------------------------------------*/ /* WinSock偺弶婜壔傪峴偆 */
wVersionRequested = MAKEWORD(1,1); /* 僶乕僕儑儞 1.1 傪梫媮偡傞 */
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if(atexit((void (*)(void))(WSACleanup))){ /* 廔椆帪偵WinSock偺儕僜乕僗傪夝曻偡傞傛偆偵偟偰偍偔 */
fprintf(stderr,"Error: atexit(WSACleanup)幐攕\n");
return -1;
}
if(nErrorStatus != 0){
fprintf(stderr,"Error: WinSock偺弶婜壔幐攕\n");
return -1;
} /* UDP儌乕僪偱soc偵僜働僢僩傪嶌惉偟傑偡 */
soc = socket(PF_INET,SOCK_DGRAM,0);
if(soc == INVALID_SOCKET){
fprintf(stderr,"Error: Socket嶌惉幐攕\n");
return -1;
} /* 僜働僢僩偺傾僪儗僗偺峔憿懱偵僒乕僶偺IP傾僪儗僗偲億乕僩斣崋傪愝掕偟傑偡 */
sockname.sin_family = AF_INET; /* 僀儞僞乕僱僢僩偺応崌 */
sockname.sin_addr.s_addr = INADDR_ANY; /* 帺暘偺IP傾僪儗僗傪巊偆傛偆偵偡傞 */
sockname.sin_port = htons((unsigned short)local_port); /* 庴怣偡傞億乕僩斣崋 */
memset(sockname.sin_zero,(int)0,sizeof(sockname.sin_zero));
if(bind(soc,(struct sockaddr *)&sockname,sizeof(sockname)) == SOCKET_ERROR){
fprintf(stderr,"庴怣億乕僩斣崋偺巜掕偵幐攕\n");
} /* svName偵僪僢僩晅偒10恑悢偱昞偟偨IP傾僪儗僗偑擖偭偰偄傞応崌丄serveraddr偵32bit惍悢偺IP傾僪儗僗偑曉傝傑偡 */
serveraddr = inet_addr((char*)svName);
if(serveraddr == -1) {
/* 僒乕僶柤(svName)偐傜僒乕僶偺忣曬傪庢摼偟傑偡 */
serverhostent = gethostbyname(svName);
if(serverhostent == NULL) {
fprintf(stderr,"Error: 儂僗僩傾僪儗僗庢摼幐攕\n");
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
return -1;
}else{
/* 僒乕僶偺忣曬偐傜IP傾僪儗僗傪serveraddr偵僐僺乕偟傑偡 */
serveraddr = *((unsigned long *)((serverhostent->h_addr_list)[0]));
}
} /* 僒乕僶偺傾僪儗僗偺峔憿懱偵僒乕僶偺IP傾僪儗僗偲億乕僩斣崋傪愝掕偟傑偡 */
serversockaddr.sin_family = AF_INET; /* 僀儞僞乕僱僢僩偺応崌 */
serversockaddr.sin_addr.s_addr = serveraddr; /* 僒乕僶偺IP傾僪儗僗 */
serversockaddr.sin_port = htons((unsigned short)port); /* 億乕僩斣崋 */
memset(serversockaddr.sin_zero,(int)0,sizeof(serversockaddr.sin_zero)); /* NTP僷働僢僩傪SNTP梡偵弶婜壔偡傞 */
NTP_Send.Control_Word = htonl(0x0B000000);
NTP_Send.root_delay = 0;
NTP_Send.root_dispersion = 0;
NTP_Send.reference_identifier = 0;
NTP_Send.reference_timestamp = 0;
NTP_Send.originate_timestamp = 0;
NTP_Send.receive_timestamp = 0;
NTP_Send.transmit_timestamp_seconds = 0;
NTP_Send.transmit_timestamp_fractions = 0; /* 僒乕僶傪巜掕偟偰NTP僷働僢僩傪憲怣偡傞 */
if(sendto(soc,(const char *)&NTP_Send, sizeof( NTP_Send ),0,(struct sockaddr *)&serversockaddr,sizeof(serversockaddr)) == SOCKET_ERROR){
fprintf(stderr,"Error: 僒乕僶傊偺憲怣幐攕\n");
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
return -1;
} /* select娭悢傪巊偭偰僞僀儉傾僂僩傪愝掕偡傞 */
waittime.tv_sec = TIMEOUT; /* 僞僀儉傾僂僩昩悢傪愝掕偡傞 */
waittime.tv_usec = 0;
FD_ZERO(&rdps);
FD_SET(soc,&rdps); /* select偡傞僜働僢僩傪捛壛偡傞 */ selret = select(FD_SETSIZE,&rdps,(fd_set *)0,(fd_set *)0,&waittime);
if(selret == SOCKET_ERROR){ /* 僄儔乕偺応崌 */
fprintf(stderr,"Error: 僒乕僶偐傜偺庴怣幐攕\n");
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
return -1;
}
if(selret == 0){ /* 僞僀儉傾僂僩偺応崌 */
fprintf(stderr,"Error: 僞僀儉傾僂僩偟傑偟偨\n");
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
return -1;
}
if(FD_ISSET(soc,&rdps) == FALSE){ /* 庴怣偼偟偨偑丄巜掕偺僜働僢僩偱偼側偄応崌 */
fprintf(stderr,"Error: 僒乕僶偐傜偺庴怣幐攕\n");
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
return -1;
} /* 僒乕僶傪巜掕偟偰庴怣傪峴偆 */
sockaddr_Size = sizeof(serversockaddr);
if(recvfrom(soc, (char *)&NTP_Recv, sizeof(NTP_Recv), 0,(struct sockaddr *)&serversockaddr,&sockaddr_Size) == SOCKET_ERROR ){
fprintf(stderr,"Error: 僒乕僶偐傜偺庴怣幐攕\n");
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
return -1;
} /* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
/*----------------------------------------------------------*/
/* NTP僒乕僶偐傜庢摼偟偨帪崗傪曇廤偡傞 */
/*----------------------------------------------------------*/ /* 儘乕僇儖儅僔儞偺帪崗傪庢摼偡傞 */
Cur_time = time(NULL); /* NTP僒乕僶偐傜庢摼偟偨帪崗傪尰抧帪娫偵曄姺偡傞 */
ntp_time = ntohl(NTP_Recv.transmit_timestamp_seconds) - 2208988800; /* 1970/01/01 偐傜偺昩悢偵曄姺 */
lpNewLocalTime = localtime((unsigned int *)&ntp_time);
if(lpNewLocalTime == NULL){
fprintf(stderr,"Error: 帪崗偺庢摼傪幐攕\n");
return -1;
} /* 儘乕僇儖帪崗偲NTP僒乕僶偺帪崗傪昞帵偡傞 */
printf("儘乕僇儖帪崗 = %s\n",ctime((unsigned int *)&Cur_time));
printf("NTP僒乕僶帪崗 = %s\n",ctime((unsigned int *)&ntp_time)); /* 摨婜僼儔僌偑棫偭偰偄傞応崌偼丄帪崗偺摨婜傪峴偆 */
if(sync_flag == TRUE){
/* 儘乕僇儖帪崗偺寁嶼 */
Timecall.wYear = lpNewLocalTime->tm_year + 1900;
Timecall.wMonth = lpNewLocalTime->tm_mon + 1;
Timecall.wDay = lpNewLocalTime->tm_mday;
Timecall.wHour = lpNewLocalTime->tm_hour;
Timecall.wMinute = lpNewLocalTime->tm_min;
Timecall.wSecond = lpNewLocalTime->tm_sec; Splitseconds = (float)ntohl(NTP_Recv.transmit_timestamp_fractions);
Splitseconds = (fl
这是windows版本,需要的话贴出emailresource.h//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by sntpcex.rc
//
#define IDI_ICONMAIN 102// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
===========================================
sntpcex.c#define _INC_OLE
#include <windows.h>
#undef _INC_OLE
#include <winsock.h>
#include <time.h>
#include "resource.h"#define ID_EDIT_SERVER 1000
#define ID_GET 1001
#define ID_SYNC 1002
#define ID_EDIT_CUR 1003
#define ID_EDIT_NTP 1004#define WSOCK_GETHOST WM_USER + 1 /* 儂僗僩忣曬偺僀儀儞僩傪捠抦偡傞儊僢僙乕僕 */
#define WSOCK_SELECT WM_USER + 2 /* 僜働僢僩僀儀儞僩傪捠抦偡傞儊僢僙乕僕 */#define BUFSIZE 256 /* 僶僢僼傽僒僀僘 */#define TIMER_ID 1 /* 僞僀儅乕偺ID */// global
HINSTANCE g_hinst; /* 傾僾儕働乕僔儑儞偺僀儞僗僞儞僗僴儞僪儖 */
BOOL sync_flag; /* 摨婜僼儔僌 */char gHostEnt[MAXGETHOSTSTRUCT]; /* 儂僗僩忣曬傪庢摼偡傞僶僢僼傽 */
HANDLE hGetHost; /* 儂僗僩忣曬傪庢摼偡傞偲偒偺旕摨婜側僞僗僋偺僴儞僪儖 */
int soc; /* 僜働僢僩乮Soket Descriptor乯 */
char SvName[BUFSIZE]; /* 僒乕僶柤 */
int Port; /* 億乕僩斣崋 */
struct sockaddr_in serversockaddr; /* NTP僒乕僶偺傾僪儗僗 */HWND ServerEdit; /* 僒乕僶柤傪擖椡偡傞僄僨傿僢僩儃僢僋僗 */
HWND hBTNGET; /* 帪崗偺庢摼傪峴偆儃僞儞 */
HWND hBTNSYNC; /* 帪崗傪摨婜偡傞儃僞儞 */
HWND LocalEdit; /* 儘乕僇儖帪崗傪昞帵偡傞僄僨傿僢僩儃僢僋僗 */
HWND NTPEdit; /* NTP帪崗傪昞帵偡傞僄僨傿僢僩儃僢僋僗 */struct NTP_Packet{ /* NTP僷働僢僩 */
int Control_Word;
int root_delay;
int root_dispersion;
int reference_identifier;
__int64 reference_timestamp;
__int64 originate_timestamp;
__int64 receive_timestamp;
int transmit_timestamp_seconds;
int transmit_timestamp_fractions;
};
/*---------------------------------------------------
擖椡偝傟偨暥帤偐傜僒乕僶柤偲僷僗傪庢傝弌偡娭悢
---------------------------------------------------*/
int GetServerPort(char *buf,char *server)
{
char *p,*r,*t,wk[8]; /* 嶌嬈梡椞堟 */
int port = 123; if(strcmp(buf,"") == 0){
return -1;
} strcpy(server,buf); /* 僒乕僶柤:億乕僩 偲側偭偰偄傞応崌偼暘妱偡傞 */
for(p = server;*p != ':' && *p != '\0';p++);
if(*p == ':'){
for(t = p + 1,r = wk;*t != '\0';t++,r++){
*r = *t;
}
*r = '\0';
port = atoi(wk); *p = '\0';
} return port;
}
/*---------------------------------------------------
僜働僢僩僀儀儞僩偺捠抦傪愝掕偡傞娭悢
---------------------------------------------------*/
BOOL SocketSelect(int sSoc,HWND hWnd)
{
/* 庴怣偺僜働僢僩僀儀儞僩傪捠抦偝偣傞傛偆偵愝掕偡傞 */
/* 僜働僢僩僀儀儞僩偼丄僂傿儞僪僂偵WSOCK_SELECT儊僢僙乕僕偱捠抦偝傟傞傛偆偵愝掕偡傞 */
if(WSAAsyncSelect(sSoc, hWnd, WSOCK_SELECT, FD_READ) == SOCKET_ERROR){
return FALSE;
}
return TRUE;
}/*---------------------------------------------------
僒乕僶偵傾僪儗僗偵IP傾僪儗僗偲億乕僩斣崋傪愝掕偡傞
---------------------------------------------------*/
void SetSockaddr(unsigned long cIPaddr,int cPort)
{ /* 僒乕僶偺傾僪儗僗偺峔憿懱偵僒乕僶偺IP傾僪儗僗偲億乕僩斣崋傪愝掕偟傑偡 */
serversockaddr.sin_family = AF_INET;
serversockaddr.sin_addr.s_addr = cIPaddr; /* IP傾僪儗僗 */
serversockaddr.sin_port = htons((unsigned short)cPort); /* 億乕僩斣崋 */
memset(serversockaddr.sin_zero,(int)0,sizeof(serversockaddr.sin_zero));
}
NTP僷働僢僩傪憲怣偡傞
---------------------------------------------------*/
BOOL SendSNTPPacket(int sSoc)
{
struct NTP_Packet NTP_Send; /* 憲怣偡傞NTP僷働僢僩 */ /* NTP僷働僢僩傪SNTP梡偵弶婜壔偡傞 */
NTP_Send.Control_Word = htonl(0x0B000000);
NTP_Send.root_delay = 0;
NTP_Send.root_dispersion = 0;
NTP_Send.reference_identifier = 0;
NTP_Send.reference_timestamp = 0;
NTP_Send.originate_timestamp = 0;
NTP_Send.receive_timestamp = 0;
NTP_Send.transmit_timestamp_seconds = 0;
NTP_Send.transmit_timestamp_fractions = 0; /* 僒乕僶傪巜掕偟偰NTP僷働僢僩傪憲怣偡傞 */
if(sendto(sSoc,(const char *)&NTP_Send, sizeof( NTP_Send ),0,(struct sockaddr *)&serversockaddr,sizeof(serversockaddr)) == SOCKET_ERROR){
return FALSE;
}
return TRUE;
}/*---------------------------------------------------
僜働僢僩傪攋婞偡傞娭悢
---------------------------------------------------*/
void SocketClose(HWND hWnd)
{
/* 僞僀儉傾僂僩梡偺僞僀儅乕傪攋婞偡傞 */
KillTimer(hWnd,TIMER_ID); /* WSAAsyncGetHostByName娭悢偺旕摨婜側僞僗僋偑偁傞応崌偼僉儍儞僙儖偡傞 */
if(hGetHost != NULL){
WSACancelAsyncRequest(hGetHost);
hGetHost = NULL;
}
/* 僜働僢僩僀儀儞僩偺捠抦傪庢傝徚偡 */
WSAAsyncSelect(soc, hWnd, 0,0);
/* 僜働僢僩傪攋婞偡傞 */
closesocket(soc);
soc = -1; if(sync_flag == FALSE){
SetWindowText(hBTNGET,"GET");
}else{
SetWindowText(hBTNSYNC,"SYNC");
}
}/*---------------------------------------------------
僜働僢僩偺僄儔乕張棟娭悢
---------------------------------------------------*/
void SocketError(HWND hWnd,char *msgbuf)
{
/* 僜働僢僩傪攋婞偡傞 */
SocketClose(hWnd); /* 僄儔乕儊僢僙乕僕 */
MessageBox(hWnd,msgbuf,"Error",MB_OK | MB_ICONERROR);}/*---------------------------------------------------
SNTP僙僢僔儑儞偺奐巒
---------------------------------------------------*/
void SNTPStart(HWND hWnd,char *buf)
{
unsigned long serveraddr; /* 僒乕僶偺IP傾僪儗僗 */ /* 擖椡暥帤偐傜僒乕僶柤偲僷僗傪庢摼偡傞 */
Port = GetServerPort(buf,SvName);
if(Port == -1){
MessageBox(hWnd, "僒乕僶柤偑擖椡偝傟偰偄傑偣傫丅", "Error", MB_OK | MB_ICONERROR);
if(sync_flag == FALSE){
SetWindowText(hBTNGET,"GET");
}else{
SetWindowText(hBTNSYNC,"SYNC");
}
return;
}
/* soc偵僜働僢僩傪嶌惉偟傑偡 */
soc = socket(PF_INET, SOCK_DGRAM, 0);
if(soc == INVALID_SOCKET){
MessageBox(hWnd, "Socket偺嶌惉偵幐攕偟傑偟偨丅", "Error", MB_OK | MB_ICONERROR);
soc = -1;
if(sync_flag == FALSE){
SetWindowText(hBTNGET,"GET");
}else{
SetWindowText(hBTNSYNC,"SYNC");
}
return;
} /* svName偵僪僢僩偱嬫愗偭偨10恑悢偺IP傾僪儗僗偑擖偭偰偄傞応崌丄serveraddr偵32bit惍悢偺IP傾僪儗僗偑曉傝傑偡 */
serveraddr = inet_addr((char*)SvName);
if(serveraddr == -1){
/* 僒乕僶柤偐傜僒乕僶偺儂僗僩忣曬傪庢摼偡傞 */
/* 儂僗僩忣曬偑庢摼偱偒傞偲丄僂傿儞僪僂偵WSOCK_GETHOST偑捠抦偝傟傞傛偆偵偡傞 */
hGetHost = WSAAsyncGetHostByName(hWnd,WSOCK_GETHOST,SvName,gHostEnt, MAXGETHOSTSTRUCT);
if(hGetHost == 0){
SocketError(hWnd,"僒乕僶偺IP傾僪儗僗偺庢摼偵幐攕偟傑偟偨丅");
return;
}
return;
}
/* 愙懕丄庴怣丄愗抐偺僀儀儞僩傪僂傿儞僪僂儊僢僙乕僕偱捠抦偝傟傞傛偆偵偡傞 */
if(SocketSelect(soc, hWnd) == FALSE){
SocketError(hWnd,"Socket僀儀儞僩傪捠抦偝偣傞愝掕偵幐攕偟傑偟偨丅");
return;
} SetSockaddr(serveraddr,Port); if(SendSNTPPacket(soc) == FALSE){
SocketError(hWnd,"憲怣偵幐攕偟傑偟偨丅");
return;
} /* 僞僀儉傾僂僩梡偺僞僀儅乕傪僙僢僩偡傞 */
SetTimer(hWnd, TIMER_ID, 3000, NULL);}/*---------------------------------------------------
IP傾僪儗僗傪庢摼偟偰僨乕僞傪憲怣偡傞
---------------------------------------------------*/
void GetHostToIPaddr(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
struct hostent FAR *HostEntry; /* 儂僗僩忣曬 */
unsigned long serveraddr; /* 僒乕僶偺IP傾僪儗僗 */ /* 僄儔乕偺敾掕 */
if(WSAGETASYNCERROR(lParam) != 0){
SocketError(hWnd,"僒乕僶偺IP傾僪儗僗偺庢摼偵幐攕偟傑偟偨丅");
return;
}
/* WSAAsyncGetHostByName偺栠傝抣偱偁傞旕摨婜側僞僗僋偺僴儞僪儖偐敾掕*/
if(hGetHost != (HANDLE)wParam){
return;
}
HostEntry = (struct hostent FAR *)gHostEnt;
serveraddr = *((unsigned long *)((HostEntry->h_addr_list)[0])); /* IP傾僪儗僗傪庢摼偡傞 */ hGetHost = NULL; /* 僜働僢僩僀儀儞僩傪僂傿儞僪僂儊僢僙乕僕偱捠抦偝傟傞傛偆偵偡傞 */
if(SocketSelect(soc, hWnd) == FALSE){
SocketError(hWnd,"Socket僀儀儞僩傪捠抦偝偣傞愝掕偵幐攕偟傑偟偨丅");
return;
} SetSockaddr(serveraddr,Port); if(SendSNTPPacket(soc) == FALSE){
SocketError(hWnd,"憲怣偵幐攕偟傑偟偨丅");
return;
} /* 僞僀儉傾僂僩梡偺僞僀儅乕傪僙僢僩偡傞 */
SetTimer(hWnd, TIMER_ID, 3000, NULL);}
SNTP偺僨乕僞傪庴怣偡傞
---------------------------------------------------*/
void SNTPRecvData(HWND hWnd)
{
struct NTP_Packet NTP_Recv; /* 庴怣偡傞NTP僷働僢僩 */
int sockaddr_Size; /* 僒乕僶偺傾僪儗僗偺僒僀僘 */
char buf[BUFSIZE]; time_t Cur_time; /* 儘乕僇儖儅僔儞偺帪崗 */
time_t ntp_time; /* NTP僒乕僶偐傜庢摼偟偨帪崗 */
struct tm *lpNewLocalTime; /* 尰抧帪崗偵曄姺偟偨NTP僒乕僶偺帪崗 */
SYSTEMTIME Timecall; /* 儘乕僇儖儅僔儞偵愝掕偡傞帪崗 */
float Splitseconds; /* 僒乕僶傪巜掕偟偰庴怣傪峴偆 */
sockaddr_Size = sizeof(serversockaddr);
if(recvfrom(soc, (char *)&NTP_Recv, sizeof(NTP_Recv), 0,(struct sockaddr *)&serversockaddr,&sockaddr_Size) == SOCKET_ERROR ){
SocketError(hWnd,"庴怣偵幐攕偟傑偟偨丅");
return;
}
/* 僜働僢僩傪攋婞偡傞 */
SocketClose(hWnd); /* 儘乕僇儖儅僔儞偺帪崗傪庢摼偡傞 */
Cur_time = time(NULL); /* NTP僒乕僶偐傜庢摼偟偨帪崗傪尰抧帪娫偵曄姺偡傞 */
ntp_time = ntohl(NTP_Recv.transmit_timestamp_seconds) - 2208988800; /* 1970/01/01 偐傜偺昩悢偵曄姺 */
lpNewLocalTime = localtime((unsigned int *)&ntp_time);
if(lpNewLocalTime == NULL){
MessageBox(hWnd,"帪崗偺庢摼偵幐攕偟傑偟偨丅","Error",MB_OK | MB_ICONERROR);
return;
} /* 摨婜僼儔僌偑棫偭偰偄傞応崌偼丄帪崗偺摨婜傪峴偆 */
if(sync_flag == TRUE){
/* 儘乕僇儖帪崗偺寁嶼 */
Timecall.wYear = lpNewLocalTime->tm_year + 1900;
Timecall.wMonth = lpNewLocalTime->tm_mon + 1;
Timecall.wDay = lpNewLocalTime->tm_mday;
Timecall.wHour = lpNewLocalTime->tm_hour;
Timecall.wMinute = lpNewLocalTime->tm_min;
Timecall.wSecond = lpNewLocalTime->tm_sec; Splitseconds = (float)ntohl(NTP_Recv.transmit_timestamp_fractions);
Splitseconds = (float)0.000000000200 * Splitseconds;
Splitseconds = (float)1000.0 * Splitseconds;
Timecall.wMilliseconds = (unsigned short)Splitseconds; /* 儘乕僇儖帪崗傪NTP僒乕僶偐傜庢摼偟偨帪崗偵愝掕偡傞 */
if(SetLocalTime(&Timecall) == FALSE){
MessageBox(hWnd,"帪崗偺愝掕偵幐攕偟傑偟偨丅","Error",MB_OK | MB_ICONERROR);
}else{
MessageBox(hWnd,"NTP僒乕僶偺帪崗偵摨婜偟傑偟偨丅","info",MB_OK | MB_ICONINFORMATION);
}
}
/* 儘乕僇儖帪崗傪昞帵偡傞 */
wsprintf(buf,"%s",ctime((unsigned int *)&Cur_time));
buf[strlen(buf) - 1] = '\0';
SendMessage(LocalEdit,WM_SETTEXT,0,(LPARAM) ((LPSTR)buf)); /* NTP僒乕僶偐傜庢摼偟偨帪崗傪昞帵偡傞 */
wsprintf(buf,"%s",ctime((unsigned int *)&ntp_time));
buf[strlen(buf) - 1] = '\0';
SendMessage(NTPEdit,WM_SETTEXT,0,(LPARAM) ((LPSTR)buf));}/*---------------------------------------------------
儊僀儞僂傿儞僪僂偺僾儘僔乕僕儍
---------------------------------------------------*/
LONG APIENTRY MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char buf[BUFSIZE]; switch (uMsg)
{
case WM_CREATE: /* 僂傿儞僪僂嶌惉帪 */
/* 僂傿儞僪僂撪偺僐儞僩儘乕儖傪嶌惉偡傞 */
CreateWindow("STATIC",(LPSTR)"Server:",WS_CHILD | WS_VISIBLE,5,10,50,25,hWnd,(HMENU)NULL,g_hinst,NULL);
CreateWindow("STATIC",(LPSTR)"Local:",WS_CHILD | WS_VISIBLE,5,50,50,25,hWnd,(HMENU)NULL,g_hinst,NULL);
CreateWindow("STATIC",(LPSTR)"NTP:",WS_CHILD | WS_VISIBLE,5,80,50,25,hWnd,(HMENU)NULL,g_hinst,NULL);
ServerEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",(LPSTR)NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,60,10,300,25,hWnd,(HMENU)ID_EDIT_SERVER,g_hinst,NULL);
LocalEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",(LPSTR)NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY,60,50,420,25,hWnd,(HMENU)ID_EDIT_CUR,g_hinst,NULL);
NTPEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",(LPSTR)NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY,60,80,420,25,hWnd,(HMENU)ID_EDIT_NTP,g_hinst,NULL);
hBTNGET = CreateWindow("BUTTON",(LPSTR)"GET",WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,370,10,50,25,hWnd,(HMENU)ID_GET,g_hinst,NULL);
hBTNSYNC = CreateWindow("BUTTON",(LPSTR)"SYNC",WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,430,10,50,25,hWnd,(HMENU)ID_SYNC,g_hinst,NULL);
SetFocus(ServerEdit);
/* 弶婜壔 */
soc = -1;
hGetHost = NULL; break; case WSOCK_GETHOST: /* 僒乕僶偺儂僗僩忣曬娭悢偺僀儀儞僩 */
/* 儂僗僩忣曬偐傜IP傾僪儗僗傪庢摼偟偰愙懕傪奐巒偡傞 */
GetHostToIPaddr(hWnd,wParam,lParam);
break; case WSOCK_SELECT: /* 僜働僢僩僀儀儞僩偺儊僢僙乕僕偺応崌(WSAAsyncSelect娭悢偵偰搊榐) */
/* 僄儔乕偺敾掕 */
if(soc != -1 && WSAGETSELECTERROR(lParam) != 0){
SocketError(hWnd,"Socket僀儀儞僩偺捠抦偱僄儔乕偑敪惗偟傑偟偨丅");
break;
}
/* 張棟偡傋偒僜働僢僩偐敾掕 */
if(soc != (int)wParam){
break;
}
/* 庴怣偺僀儀儞僩偺応崌偼張棟傪峴偆 */
if(WSAGETSELECTEVENT(lParam) == FD_READ){
/* 僨乕僞傪庴怣偡傞 */
SNTPRecvData(hWnd);
}
break; case WM_COMMAND:
switch(LOWORD(wParam)){
case ID_GET: /* 庢摼偡傞儃僞儞偑墴偝傟偨偲偒偺張棟 */
if(soc != -1){ /* 婛偵捠怣拞偺応崌偼僉儍儞僙儖偡傞 */
/* 僜働僢僩傪攋婞偡傞 */
SocketClose(hWnd);
}else{ /* 捠怣傪奐巒偡傞 */
/* 僒乕僶柤傪庢摼偡傞 */
SendMessage(ServerEdit,WM_GETTEXT,BUFSIZE - 1,(LPARAM)buf);
SetWindowText(hBTNGET,"Cancel");
/* 摨婜僼儔僌傪婾偵愝掕偡傞 */
sync_flag = FALSE;
/* SNTTP僙僢僔儑儞傪奐巒偡傞 */
SNTPStart(hWnd,buf);
}
break; case ID_SYNC: /* 摨婜偡傞儃僞儞偑墴偝傟偨偲偒偺張棟 */
if(soc != -1){ /* 婛偵捠怣拞偺応崌偼僉儍儞僙儖偡傞 */
/* 僜働僢僩傪攋婞偡傞 */
SocketClose(hWnd);
}else{ /* 捠怣傪奐巒偡傞 */
/* 僒乕僶柤傪庢摼偡傞 */
SendMessage(ServerEdit,WM_GETTEXT,BUFSIZE - 1,(LPARAM)buf);
SetWindowText(hBTNSYNC,"Cancel");
/* 摨婜僼儔僌傪恀偵愝掕偡傞 */
sync_flag = TRUE;
/* SNTP僙僢僔儑儞傪奐巒偡傞 */
SNTPStart(hWnd,buf);
}
break;
}
break; case WM_TIMER: /* 僞僀儉傾僂僩帪偺張棟 */
if(wParam == TIMER_ID){
/* 僞僀儉傾僂僩偺儊僢僙乕僕傪昞帵偡傞 */
SocketError(hWnd,"僞僀儉傾僂僩偟傑偟偨丅");
break;
}
break; case WM_DESTROY:
PostQuitMessage(0);
break; case WM_ENDSESSION:
return 0; case WM_CLOSE:
/* 捠怣拞偺応崌偼僉儍儞僙儖偡傞 */
if(soc != -1){
/* 僜働僢僩傪攋婞偡傞 */
SocketClose(hWnd);
} /* 僂傿儞僪僂傪攋婞偡傞 */
DestroyWindow(hWnd);
break; default:
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0);}
WinSock偺弶婜壔傪峴偆娭悢
---------------------------------------------------*/
BOOL initWinsock(void)
{
WORD wVersionRequested;
int nErrorStatus;
WSADATA wsaData; wVersionRequested = MAKEWORD(1, 1); /* 僶乕僕儑儞 1.1 傪梫媮偡傞 */
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (atexit((void (*)(void))(WSACleanup))) { /* 廔椆帪偵WinSock偺儕僜乕僗傪夝曻偡傞傛偆偵偟偰偍偔 */
MessageBox(NULL, "WinSock偺弶婜壔偵幐攕偟傑偟偨丅", "Error", MB_OK | MB_ICONERROR);
return FALSE;
}
if ( nErrorStatus != 0 ) {
MessageBox(NULL, "WinSock偺弶婜壔偵幐攕偟傑偟偨丅", "Error", MB_OK | MB_ICONERROR);
return FALSE;
}
return TRUE;
}/*---------------------------------------------------
僂傿儞僪僂僋儔僗偺搊榐傪峴偆娭悢
---------------------------------------------------*/
BOOL InitApplication(HANDLE hInstance)
{
WNDCLASS wc; /* 僂傿儞僪僂僋儔僗傪搊榐偡傞 */
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)MainProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICONMAIN));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (void*)COLOR_BTNSHADOW;
wc.lpszMenuName = MAKEINTRESOURCE(200);
wc.lpszClassName = "sntpexMainWindowClass"; return (RegisterClass(&wc));
}/*---------------------------------------------------
僂傿儞僪僂偺嶌惉傪峴偆娭悢
---------------------------------------------------*/
BOOL InitInstance( HANDLE hInstance, int nCmdShow)
{
HWND hWnd;
RECT DeskTopRect; GetWindowRect(GetDesktopWindow(),(LPRECT)&DeskTopRect); hWnd = CreateWindow("sntpexMainWindowClass",
"snptcex Ver 0.0",
WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX,
(DeskTopRect.right / 2) - (500 / 2),
(DeskTopRect.bottom / 2) - (140 / 2),
500,
140,
NULL,
NULL,
g_hinst,
NULL
); if (!hWnd){
return (FALSE);
} /* 僂傿儞僪僂傪昞帵偡傞 */
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return (TRUE);}/*---------------------------------------------------
儊僀儞娭悢
---------------------------------------------------*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg; g_hinst = hInstance; /* WinSock偺弶婜壔傪峴偆 */
if (!initWinsock()) {
return FALSE;
} /* 僂傿儞僪僂僋儔僗偺搊榐傪峴偆 */
if (!InitApplication(hInstance)){
return (FALSE);
}
/* 僂傿儞僪僂偺嶌惉傪峴偆 */
if (!InitInstance(hInstance, nCmdShow)){
return (FALSE);
} /* 僂傿儞僪僂儊僢僙乕僕傪張棟偡傞 */
while (GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
} return (msg.wParam);}