zoukankan      html  css  js  c++  java
  • Winsock编程基继承基础(网络对时程序)

    #include <iostream>
    #include <stdio.h>
    
    #include "InitSock.h"
    
    using namespace std;
    
    void SetTimeFromTP(ULONG ulTime);
    
    int main(void)
    {
        CInitSock initSock;
        //创建套接字
        SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (s == INVALID_SOCKET)
        {
            cout << "Failed socke()" << endl;
            return 0;
        }
        //创建套接字之后如果首先sendto可以不绑定
        //若首先recvfrom则需要绑定
    
        //填写远程地址信息
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(37);
        addr.sin_addr.S_un.S_addr = inet_addr("129.6.15.28 "); //可在http://tf.nist.gov/service/time-servers.html得到IP
    
        //连接服务器
        if (connect(s, (sockaddr*)&addr, sizeof(addr)) == -1)
        {
            cout << "Failed connect()" << endl;
            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);
            SetTimeFromTP(ulTime);
            cout << "成功与服务器时间同步" << endl;
            cout << "接收到的数据: " << ulTime << endl;
        }
        else
        {
            cout << "服务器不能确认当前时间" << endl;
        }
        
        closesocket(s);
        
        getchar();
        return 0;
    }
    
    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;
        //注意文件时间的单位
        *pLLong += (LONGLONG)10000000 * ulTime;
        //再将时间转换回来,更新系统时间
        FileTimeToSystemTime(&ft, &st);
        //SetSystemTime(&st);
        cout << st.wYear << ""
            << st.wMonth << ""
            << st.wDay << ""
            << st.wHour + 8<< ""    //...    
            << st.wMinute << ""
            << st.wSecond << "" << endl;
            
    }
     
  • 相关阅读:
    mysql数据库开放远程连接的方法
    MySQL数据库字符集由utf8修改为utf8mb4一例
    解决silk-v3-decoder-master转换wav时,百度语音解析问题
    PHP高效率写法(详解原因)
    如何计算服务器能够承受多大的pv?
    微信开发中使用curl忽略https证书
    PHP libevent函数基本介绍
    PHP stream相关协议及上下文选项和参数归纳
    Centos搭建PHP5.3.8+Nginx1.0.9+Mysql5.5.17
    编码转换(UTF8->GBK)
  • 原文地址:https://www.cnblogs.com/chenxingyang/p/9748123.html
Copyright © 2011-2022 走看看