设为首页 加入收藏

TOP

vc/C++中使用网络校正时间
2013-04-10 11:38:03 来源: 作者: 【 】 浏览:221
Tags:vc/C 使用 网络 校正 时间

  1 BOOL UpdateSysTime()

  2{

  3    WORD    wVersionRequested;

  4    WSADATA wsaData;

  5

  6    // 初始化版本

  7    wVersionRequested = MAKEWORD( 1, 1 );

  8    if (0!=WSAStartup(wVersionRequested, &wsaData))

  9    {

  10        WSACleanup();

  11        return FALSE;

  12    }

  13    if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)

  14    {

  15        WSACleanup( );

  16        return FALSE;

  17    }

  18

  19    // 这个IP是中国大陆时间同步服务器地址,可自行修改

  20    SOCKET soc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

  21    struct sockaddr_in addrSrv;

  22    addrSrv.sin_addr.S_un.S_addr=inet_addr("210.72.145.44");

  23    addrSrv.sin_family=AF_INET;

  24    addrSrv.sin_port=htons(123);

  25

  26    NTP_Packet NTP_Send,NTP_Recv;

  27    NTP_Send.Control_Word   =   htonl(0x0B000000);

  28    NTP_Send.root_delay        =   0;

  29    NTP_Send.root_dispersion   =   0;

  30    NTP_Send.reference_identifier    =   0;

  31    NTP_Send.reference_timestamp    =   0;

  32    NTP_Send.originate_timestamp    =   0;

  33    NTP_Send.receive_timestamp        =   0;

  34    NTP_Send.transmit_timestamp_seconds        =   0;

  35    NTP_Send.transmit_timestamp_fractions   =   0;

  36

  37    if(SOCKET_ERROR==sendto(soc,(const char*)&NTP_Send,sizeof(NTP_Send),

  38        0,(struct sockaddr*)&addrSrv,sizeof(addrSrv)))

  39    {

  40        closesocket(soc);

  41        return FALSE;

  42    }

  43    int sockaddr_Size =sizeof(addrSrv);

  44    if(SOCKET_ERROR==recvfrom(soc,(char*)&NTP_Recv,sizeof(NTP_Recv),

  45        0,(struct sockaddr*)&addrSrv,&sockaddr_Size))

  46    {

  47        closesocket(soc);

  48        return FALSE;

  49    }

  50    closesocket(soc);

  51    WSACleanup();

  52

  53    SYSTEMTIME    newtime;

  54    float        Splitseconds;

  55    struct        tm    *lpLocalTime;

  56    time_t        ntp_time;

  57

  58    // 获取时间服务器的时间

  59    ntp_time    = ntohl(NTP_Recv.transmit_timestamp_seconds)-2208988800;

  60    lpLocalTime = localtime(&ntp_time);

  61    if(lpLocalTime == NULL)

  62    {

  63        return FALSE;

  64    }

  65

  66    // 获取新的时间

  67    newtime.wYear      =lpLocalTime->tm_year+1900;

  68    newtime.wMonth     =lpLocalTime->tm_mon+1;

  69    newtime.wDayOfWeek =lpLocalTime->tm_wday;

  70    newtime.wDay       =lpLocalTime->tm_mday;

  71    newtime.wHour      =lpLocalTime->tm_hour;

  72    newtime.wMinute    =lpLocalTime->tm_min;

  73    newtime.wSecond    =lpLocalTime->tm_sec;

  74

  75    // 设置时间精度

  76    Splitseconds=(float)ntohl(NTP_Recv.transmit_timestamp_fractions);

  77    Splitseconds=(float)0.000000000200 * Splitseconds;

  78    Splitseconds=(float)1000.0 * Splitseconds;

  79    newtime.wMilliseconds   =   (unsigned   short)Splitseconds;

  80

  81    // 修改本机系统时间

  82    SetLocalTime(&newtime);

  83    return TRUE;

  84}

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC调用外部程序接口 下一篇VC中常见错误和解决方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: