首页 > 编程语言 >c# NTP 时间同步

c# NTP 时间同步

时间:2024-05-30 16:56:16浏览次数:14  
标签:同步 string c# NTP System DateTime SERVER public socket

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace SmartConstructionSite.Common.Helper
{
    public class NTPHelper
    {
        public const string WINDOWS_SERVER = "time.windows.com";
        public const string GOOGLE_SERVER = "time.google.com";
        public const string JAPAN_SERVER = "ntp1.jst.mfeed.ad.jp";
        public const string CHINA_SERVER = "cn.pool.ntp.org";
        public const string ALI_SERVER = "ntp.aliyun.com";
 
        /// <summary>
        /// 获取服务器时间
        /// </summary>
        /// <param name="time">UTC时间</param>
        /// <returns></returns>
        private static bool GetNTPTime(out DateTime time, out string error, string server = ALI_SERVER)
        {
            time = DateTime.Now;
            error = "";
            try
            {
                byte[] ntpData = new byte[48];
                ntpData[0] = 0x1B;
                IPAddress[] addresses = Dns.GetHostEntry(server).AddressList;
                IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], 123);
 
                //socket连接
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                socket.Connect(ipEndPoint);
                socket.ReceiveTimeout = 3000;
                socket.Send(ntpData);
                socket.Receive(ntpData);
                socket.Close();
 
                //数据解析
                byte serverReplyTime = 40;
                ulong intPart = System.BitConverter.ToUInt32(ntpData, serverReplyTime);
                ulong fractPart = System.BitConverter.ToUInt32(ntpData, serverReplyTime + 4);
                intPart = SwapEndianness(intPart);
                fractPart = SwapEndianness(fractPart);
 
                ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
                time = (new System.DateTime(1900, 1, 1, 0, 0, 0, System.DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);
                return true;
            }
            catch (Exception ex)
            {
                error = ex.Message;
                return false;
            }
        }
        public static DateTime GetNTPTime()
        {
            DateTime dateTime;
            if (NTPHelper.GetNTPTime(out DateTime time, out string error, NTPHelper.WINDOWS_SERVER))
            {
                dateTime = time;
            }
            else
            {
                //同步失败
                dateTime = DateTime.MinValue;
            }
            return dateTime;
 
        }
 
        /// <summary>
        /// 大小端互换
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        private static uint SwapEndianness(ulong x)
        {
            return (uint)(((x & 0x000000ff) << 24) +
                           ((x & 0x0000ff00) << 8) +
                           ((x & 0x00ff0000) >> 8) +
                           ((x & 0xff000000) >> 24));
        }
    }
}

标签:同步,string,c#,NTP,System,DateTime,SERVER,public,socket
From: https://www.cnblogs.com/soulice/p/18222705

相关文章

  • Ubuntu22.04安装部署基于dockers的K8s目前最新版本1.30.1版本
    其实之前也写过其他系统、其他版本的部署,但是,由于在1.28版本之后,安装略有所变化,所以,这里再写一篇基础环境主机名配置角色系统版本IP安装的组件master4核4GmasterUbuntu22.04192.168.140.75apiserver、controller-manager、scheduler、kubelet、etcd、kube-pro......
  • easyexcel导出树状结构
    主类packagecn.piesat.nj.farm.agricultural;importcom.alibaba.excel.write.metadata.fill.FillConfig;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.Row;import......
  • SQL Server报错:数据库"YourDatabaseName"的事务日志已满,原因为"LOG_BACKUP"
      通过以下代码可以收缩日志,执行完后就不报错了。--设置简单模式USE[master]GOALTERDATABASEYourDatabaseNameSETRECOVERYSIMPLEWITHNO_WAITGOALTERDATABASEYourDatabaseNameSETRECOVERYSIMPLEGO--设置压缩后的日志大小为2M,可自定义USEY......
  • c++ 模板
     来自:https://sg-first.gitbooks.io/cpp-template-tutorial/content/T_ji_ben_yu_fa.html 1.Template的基本语法1.1TemplateClass基本语法1.1.1TemplateClass的与成员变量定义我们来回顾一下最基本的TemplateClass声明和定义形式:TemplateClass声明:template<type......
  • 基于at24c02的按键检测C51程序
    1#include<reg51.h>2#include<intrins.h>3#include<lcd1602.h>4#defineucharunsignedchar5#defineuintunsignedint6#defineulongunsignedlong78#defineEEPROM_ADDR0xA09sbitSDA=P2^0;10......
  • ComfyUI抠图--输入关键词
    上篇写了自动扣图https://www.cnblogs.com/qcy-blog/p/18207984这个适合把所有的东西扣出来如果是只扣个头发之类的就不行了,推荐使用ComfyUISegmentAnything地址https://github.com/storyicon/comfyui_segment_anything下载模型GroundingDino到models/grounding-dino下......
  • malloc()函数
    malloc()函数malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域,以void*类型返回分配的内存区域地址。函数原型void*malloc(unsignedintnum_bytes);分配长度为num_bytes字节的内存块。使用时要包含头文件stdlib.h,也可以使用#include<malloc.h>,但并不建议,......
  • 在kubernetes里使用seccomp限制容器的系统调用
    目录一.系统环境二.前言三.系统调用简介四.使用seccomp限制docker容器系统调用五.在kubernetes里使用seccomp限制容器的系统调用5.1配置seccomp允许pod进行所有系统调用5.2配置seccomp禁止pod进行所有系统调用5.3配置seccomp允许pod进行50个系统调用六.总结一.系统环境本文主......
  • 结构体类型一(C语言)
    前言Hello,小伙伴们,好久不见我又来了,今天我将着重介绍结构体相关的知识,还是老话,如果你喜欢我的内容的话,请不要忘了,点赞,收藏,评论哟,万分感谢!!在实际编程过程中,我们可能会希望把一些关联的数据存放在一起,这样方便我们使用。但是这些数据的类型有时候并不一致,例如一个学生的信息:有......
  • DevSecOps未来趋势所在
    0X00前言DevSecOps代表开发、安全和运营。它是一种文化、自动化和平台设计方法,将安全性作为整个IT生命周期的共同责任进行整合DevOps不仅仅涉及开发和运营团队。如果企业想充分利用DevOps方法的敏捷性和响应能力,还必须在应用程序的整个生命周期中发挥综合作用。过去,安全......