随笔 - 224  文章 - 41  trackbacks - 0
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

享受编程

常用链接

留言簿(11)

随笔分类(159)

随笔档案(224)

文章分类(2)

文章档案(4)

经典c++博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 1BOOL UpdateSysTime()
 2{
 3    WORD    wVersionRequested;
 4    WSADATA wsaData;
 5    
 6    // 初始化版本
 7    wVersionRequested = MAKEWORD( 11 );
 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}
posted on 2010-06-16 18:09 漂漂 阅读(4041) 评论(6)  编辑 收藏 引用 所属分类: 深入vc++

FeedBack:
# re: vc/C++中使用网络校正系统时间 2010-09-02 21:56 三位数
请问结构体NTP_Packet的定义在哪里?
  回复  更多评论
  
# re: vc/C++中使用网络校正系统时间 2010-09-05 11:13 漂漂
@三位数
struct NTP_Packet
{
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;
};

  回复  更多评论
  
# re: vc/C++中使用网络校正系统时间 2010-12-13 16:49 Alemon
请问服务端的代码怎么写呢?谢谢 @漂漂
  回复  更多评论
  
# re: vc/C++中使用网络校正系统时间 2010-12-14 21:34 漂漂
这个我还真不知道,这个服务器是国际校准中心的一个东西,@Alemon
@三位数
  回复  更多评论
  
# Ppl like you get all the bnrias. I just get to say thanks for he answer. 2011-05-26 12:56 Krystalyn
Ppl like you get all the bnrias. I just get to say thanks for he answer.  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理