• NetTime——c++实现计算机时间与网络时间的更新


    《Windows网络与通信程序设计》第二章的一个小例子,网络编程入门。

    #include "stdafx.h"
    #include <WinSock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include <iostream>
    
    #pragma comment(lib,"ws2_32.lib")    
    using namespace std;
    
    
    BOOL  InitSock();
    void  SetTimeFromTP(ULONG ulTime);
    
    
    int main()
    {
        if (InitSock()==FALSE)
        {
            return 0;
        }
    
        SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
            printf(" Failed socket() 
    ");
            return 0;
        }
    
        // 填写远程地址信息,连接到时间服务器
        sockaddr_in servAddr; 
        servAddr.sin_family = AF_INET;
        servAddr.sin_port = htons(37);   //用窗口37监听 
    
        // 这里使用的时间服务器是129.6.15.28,更多地址请参考http://tf.nist.gov/service/its.htm
        servAddr.sin_addr.S_un.S_addr = inet_addr("129.6.15.29");
        if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
        {
            printf(" Failed connect() 
    ");
            return 0;
        }
        
        // 等待接收时间协议返回的时间。学习了Winsock I/O模型之后,最好使用异步I/O,以便设置超时
    
        ULONG ulTime = 0;
        int nRecv = ::recv(s, (char*)&ulTime, sizeof(ulTime), 0);
    
        if(nRecv > 0)
        {
            ulTime = ntohl(ulTime);
    
            SYSTEMTIME st;
            GetLocalTime(&st);
            printf("本地当前时间为:%d-%d-%02d %02d:%02d:%02d
    ",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
    
            SetTimeFromTP(ulTime);
            printf(" 成功与时间服务器的时间同步!
    ");
            
            system("PAUSE");
        }
        else
        {
            printf(" 时间服务器不能确定当前时间!
    ");
            system("PAUSE");
        }
        
        closesocket(s);
        return 0;
    }
    
    
    
    BOOL  InitSock()
    {
        WSAData  wsaData = {0};
        if(WSAStartup(MAKEWORD(2,2),&wsaData)==0)
        {
            return TRUE;
        }
    
        return FALSE;
    }
    
    
    
    void SetTimeFromTP(ULONG ulTime)    // 根据时间协议返回的时间设置系统时间
    {
        // Windows文件时间是一个64位的值,它是从1601年1月1日中午12:00到现在的时间间隔,
        // 单位是1/1000 0000秒,即1000万分之1秒(100-nanosecond )
        FILETIME ft;
        SYSTEMTIME st;
    
        // 首先将基准时间(1900年1月1日0点0分0秒0毫秒)转化为Windows文件时间    
        st.wYear = 1900;
        st.wMonth = 1;
        st.wDay = 1;
        st.wHour = 0;
        st.wMinute = 0;
        st.wSecond = 0;
        st.wMilliseconds = 0;
        SystemTimeToFileTime(&st, &ft);
    
        // 然后将Time Protocol使用的基准时间加上以及逝去的时间,即ulTime
        LONGLONG *pLLong = (LONGLONG *)&ft;
        // 注意,文件时间单位是1/1000 0000秒,即1000万分之1秒(100-nanosecond )
        *pLLong += (LONGLONG)10000000 * ulTime; 
    
        // 再将时间转化回来,更新系统时间
        FileTimeToSystemTime(&ft, &st);    
        SetSystemTime(&st);
        printf("已更新至服务器当前时间为:%d-%d-%02d %02d:%02d:%02d
    ",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
    
    }
  • 相关阅读:
    Spring核心概念
    机器学习第二次作业
    机器学习第一次作业
    软工实践个人总结
    第04组 Beta版本演示
    第04组 Beta冲刺(5/5)
    第04组 Beta冲刺(4/5)
    第04组 Beta冲刺(3/5)
    第04组 Beta冲刺(2/5)
    第04组 Beta冲刺(1/5)
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/6444098.html
Copyright © 2020-2023  润新知