从网络上同步时间,在PPC中可以起到自动校准时间的作用, 时间的设置很简单,我这里就不多写了,主要是获得时间数据。
1、获得因特网的时间数据。
int GetInternetTime(ULONG &ulTime)
{
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock)
{
return -1;
}
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(37);
// http://tf.nist.gov/tf-cgi/servers.cgi
// nist1-sj.WiTime.net 64.125.78.85 San Jose, California
servAddr.sin_addr.S_un.S_addr = inet_addr("64.125.78.85");
int i;
BOOL bCont = FALSE;
for (i = 0; i < RETRY_TIMES; i++)
{
if (-1 == connect(sock, (sockaddr *)&servAddr, sizeof(servAddr)))
{
continue;
}
else
{
bCont = TRUE;
break;
}
}
int nRecv = SOCKET_ERROR;
if (bCont)
{
bCont = FALSE;
for (i = 0; i < RETRY_TIMES; i++)
{
nRecv = recv(sock, (char *)&ulTime, sizeof(ulTime), 0);
if (nRecv > 0)
{
ulTime = ntohl(ulTime);
bCont = TRUE;
break;
}
else
{
continue;
}
}
}
closesocket(sock);
if (FALSE == bCont)
{
return -2;
}
return 0;
}
2、由Internet 时间转化为系统时间:
void ITimeToSTime(SYSTEMTIME &st, const ULONG ulTime)
{
FILETIME ft;
SYSTEMTIME stBase;
memset(&stBase, 0, sizeof(stBase));
stBase.wYear = 1900;
stBase.wMonth = 1;
stBase.wDay = 1;
SystemTimeToFileTime(&stBase, &ft);
LONGLONG * pLLong = (LONGLONG *) &ft;
*pLLong += (LONGLONG) 10000000 * ulTime;
FILETIME ft_local;
FileTimeToLocalFileTime(&ft, &ft_local);
FileTimeToSystemTime(&ft_local, &st);
}
3、在吧转化好的系统时间设置成系统的时间,大功告成。