.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)

net,ntp,windows · 浏览次数 : 9

小编点评

**步骤 1:启用 NTP 服务** * 打开 Windows 注册表。 * 搜索 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer`。 * 在 `Enabled` 值中找到 `1`,并将它设置为 `1`。 **步骤 2:配置 NTP 服务器模式** * 启动 `Windows&Time` 服务。 * 右键点击服务,选择“重启”。 * 在命令中输入以下命令,并按 Enter 键: ``` w32tm /config /reliable:YES /updatenet stop w32timenet start w32time ``` **步骤 3:配置 NTP 时间服务器** * 打开 `w32tm.exe` 应用程序。 * 点击“客户端”按钮。 * 在“服务器地址”文本框中输入 NTP 服务端的 IP 地址或域名地址。 * 设置默认端口号为 `123`。 * 点击“确定”。 **步骤 4:获取时间** * 运行以下命令,并按 Enter 键: ``` w32tm /stripchart /computer:ip地址 /samples:5 /dataonly ``` **步骤 5:设置系统时间** * 运行以下命令,并按 Enter 键: ``` NtpClient.SetSystemTime(time) ``` **步骤 6:测试时间同步** * 运行以下命令,并按 Enter 键: ``` static void Main(string[] args){ string ntpServer = "ip"; Console.WriteLine($"\当前时间:\\r\{ DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss ms\")}\"); DateTime time = NtpClient.GetNtpServerTime(ntpServer); Console.WriteLine($"\获取到的时间为:\\r\ {time.ToString(\"yyyy/MM/dd HH:mm:ss ms\")}\"); NtpClient.SetSystemTime(time); Console.WriteLine($"\更改后的系统时间:\\r\{ DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss ms\")}\"); Console.ReadLine(); } ``` **注意:** * NTP 服务端需要在本地运行才能提供时间同步服务。 * 可以在 `w32tm.exe` 中使用 `-h` 参数查看 NTP 服务端的 IP 地址和端口号。 * 您可以使用其他工具,例如 `timedatectl`,来查看系统时间。

正文

对某个远程服务器启用和设置NTP服务(Windows系统)

打开注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer

将 Enabled 的值设置为 1,这将启用NTP服务器功能。

防火墙开放UDP 123端口

打开“服务”应用(可以在开始菜单搜索“服务”),找到“Windows Time”服务。右键点击“Windows Time”服务,选择“重启”。

执行以下命令来配置服务器模式并重启时间服务:

w32tm /config /reliable:YES /update
net stop w32time
net start w32time

 

客户端上面,输入以下命令,替换你自己的NTP服务端IP即可,如果显示类似以下的时间输出,说明是正常的。

w32tm /stripchart /computer:ip地址 /samples:5 /dataonly

 

 编写程序,进行时间同步

引用包Wesky.Net.OpenTools ,版本选择1.0.6或以上版本。

 

该包的自述文件内容供参考:

https://www.nuget.org/packages/Wesky.Net.OpenTools/1.0.6#readme-body-tab

 在程序里面使用,以下测试内容供参考。其中,ntpServer可以是ip地址也可以是ntp服务器的域名地址或者互联网ntp服务器地址等。获取时间默认端口号没指定的话是123,如果要指定,只需要在参数里面新增端口号参数即可。

 

static void Main(string[] args)
{
    string ntpServer = "ip";
    Console.WriteLine($"当前时间:\r\n{ DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss ms")}");
    DateTime time = NtpClient.GetNtpServerTime(ntpServer);
    Console.WriteLine($"获取到的时间为:\r\n {time.ToString("yyyy/MM/dd HH:mm:ss ms")}");
    NtpClient.SetSystemTime(time);
    Console.WriteLine($"更改后的系统时间:\r\n{ DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss ms")}");
    Console.ReadLine();
}

获取ntp服务器时间核心代码解析如下:

 1 /// <summary>
 2 /// 获取NTP服务器的时间。
 3 /// Retrieves the time from an NTP server.
 4 /// </summary>
 5 /// <param name="ntpServer">NTP服务器地址 | NTP server address</param>'
 6 /// <param name="ntpPort">NTP服务的端口 | NTP service port</param>
 7 /// <returns>服务器时间 | Server time</returns>
 8 public static DateTime GetNtpServerTime(string ntpServer,int ntpPort=123)
 9 {
10     // 初始化NTP数据缓冲区
11     // Initialize NTP data buffer
12     byte[] ntpData = new byte[NtpDataLength];
13     ntpData[0] = 0x1B; // NTP version number (3) and mode (3), client request
14 
15     var addresses = Dns.GetHostAddresses(ntpServer);
16     IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], ntpPort);
17 
18     using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
19     {
20         socket.Connect(ipEndPoint);
21         socket.Send(ntpData);
22         socket.Receive(ntpData);
23     }
24 
25     // 从字节40和44提取时间戳
26     // Extract timestamp from bytes 40 and 44
27     ulong intPart = BitConverter.ToUInt32(ntpData, 40);
28     ulong fractPart = BitConverter.ToUInt32(ntpData, 44);
29 
30     // 转换字节序为小端格式
31     // Convert byte order to little endian
32     intPart = SwapEndianness(intPart);
33     fractPart = SwapEndianness(fractPart);
34 
35     var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
36 
37     // NTP时间是从1900年开始计算的,这里将其转换为UTC时间
38     // NTP time starts from 1900, this converts it to UTC DateTime
39     DateTime networkDateTime = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds((long)milliseconds);
40 
41     return networkDateTime.ToLocalTime();
42 }

 

与.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)相似的内容:

.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)

对某个远程服务器启用和设置NTP服务(Windows系统) 打开注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 将 Enabled 的值设置为 1,这将启用NTP服务器功

使用C#/.NET解析Wiki百科数据实现获取历史上的今天

创建一个webapi项目做测试使用。 创建新控制器,搭建一个基础框架,包括获取当天日期、wiki的请求地址等 创建一个Http请求帮助类以及方法,用于获取指定URL的信息 使用http请求访问指定url,先运行一下,看看返回的内容。内容如图右边所示,实际上是一个Json数据。我们主要解析 大事记 部

EarthChat SignalR原理讲解

SignalR原理讲解 SignalR是什么? SignalR 是 Microsoft 开发的一个库,用于 ASP.NET 开发人员实现实时 web 功能。这意味着服务端代码可以实时地推送内容到连接的客户端,而不需要客户端定期请求或轮询服务器以获取新数据。SignalR 可以用于各种应用程序,如实时

.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法

前言 前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通过反射动态执行类的方法,从而实现更灵活的编程方

使用.NET查询日出日落时间

在WPF中,通过资源文件实现主题切换是个常见的功能,有不少文章介绍了如何实现手动切换主题。那如何实现自动切换主题呢?通常有两种机制:一是跟随系统明暗主题切换,二是像手机操作系统那样根据日出日落时间自动切换。本文将以终为始,采用倒推法一步步介绍如何使用.NET免费获取日出日落时间。 获取日出日落时间

.NET Task 揭秘(3)async 与 AsyncMethodBuilder

前言 本文为系列博客 什么是 Task Task 的回调执行与 await async 与 AsyncMethodBuilder(本文) 总结与常见误区(TODO) 上文我们学习了 await 这个语法糖背后的实现,了解了 await 这个关键词是如何去等待 Task 的完成并获取 Task 执行结

【c#版本Openfeign】Net8 自带OpenFeign实现远程接口调用

引言 相信巨硬,我们便一直硬。Net版本到现在已经出了7了,8也已经在预览版了,相信在一个半月就会正式发布,其中也有很多拭目以待的新功能了,不仅仅有Apm和Tap的结合,TaskToAscynResult,以及UnsafeAccessor用来获取私有变量,性能比反射,EMIT更高,还有针对Async

【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)

在前一篇文章中,我们是把.NET 8应用读取SSL证书(X509)示例部署在App Service Windows环境中,那么如果部署在Linux环境,以及Linux Container中呢? 根据前文中的第一种方法,直接在把证书文件包含在源文件中,通过相对路径读取证书文件的方式,经测试,可以正常工

【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)

在使用App Service服务部署业务应用,因为有些第三方的接口需要调用者携带TLS/SSL证书(X509 Certificate),在官方文档中介绍了两种方式在代码中使用证书: 1) 直接使用证书文件路径加载证书 new X509Certificate2 2) 从系统的证书库中通过指纹加载...

Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验

Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念。这包括服务、缓存、工作流、复原能力、机密管理等之间的安全同步和异步通信。不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业务功能。在您的时间有限并且您只想进行实验的情况下,在Dapr初始设置上花费大量时间可能会令人沮丧。更