Internet time 时间同步(转载)

来源:互联网 发布:redux js 编辑:程序博客网 时间:2024/06/13 03:31
原文地址:http://hi.baidu.com/chris_cui/blog/item/529c09506726c72d42a75bd1.html

从网络上同步时间,在PPC中可以起到自动校准时间的作用,时间的设置很简单,我这里就不多写了,主要是获得时间数据。

1、获得因特网的时间数据。


int GetInternetTime(ULONG &ulTime)
{
    SOCKET sock =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET ==sock)
    {
       return -1;
    }
    sockaddr_inservAddr;
    servAddr.sin_family =AF_INET;
    servAddr.sin_port =htons(37);

    //http://tf.nist.gov/tf-cgi/servers.cgi 
    // nist1-sj.WiTime.net64.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 ULONGulTime)
{
    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、在吧转化好的系统时间设置成系统的时间,大功告成。
原创粉丝点击