通过NTP协议进行时间同步

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             GetNetworkTime();
 6         }
 7
 8         public static DateTime GetNetworkTime()
 9         {
10             //default Windows time server
11             const string ntpServer = "clock.via.net";
12
13             // NTP message size - 16 bytes of the digest (RFC 2030)
14             var ntpData = new byte[48];
15
16             //Setting the Leap Indicator, Version Number and Mode values
17             ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)
18
19             var addresses = Dns.GetHostEntry(ntpServer).AddressList;
20
21             //The UDP port number assigned to NTP is 123
22             var ipEndPoint = new IPEndPoint(addresses[0], 123);
23             //NTP uses UDP
24             var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
25
26             socket.Connect(ipEndPoint);
27
28             //Stops code hang if NTP is blocked
29             socket.ReceiveTimeout = 3000;
30
31             socket.Send(ntpData);
32             socket.Receive(ntpData);
33             socket.Close();
34
35             //Offset to get to the "Transmit Timestamp" field (time at which the reply
36             //departed the server for the client, in 64-bit timestamp format."
37             const byte serverReplyTime = 40;
38
39             //Get the seconds part
40             ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
41
42             //Get the seconds fraction
43             ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);
44
45             //Convert From big-endian to little-endian
46             intPart = SwapEndianness(intPart);
47             fractPart = SwapEndianness(fractPart);
48
49             var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
50
51             //**UTC** time
52             var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);
53
54             return networkDateTime.ToLocalTime();
55         }
56
57         // stackoverflow.com/a/3294698/162671
58         static uint SwapEndianness(ulong x)
59         {
60             return (uint)(((x & 0x000000ff) << 24) +
61                            ((x & 0x0000ff00) << 8) +
62                            ((x & 0x00ff0000) >> 8) +
63                            ((x & 0xff000000) >> 24));
64         }
65     }

.net代码实现

时间: 2024-07-28 17:03:38

通过NTP协议进行时间同步的相关文章

实现基于NTP协议的网络校时功能

无论PC端还是移动端系统都自带时间同步功能,基于的都是NTP协议,这里使用C#来实现基于NTP协议的网络校时功能(也就是实现时间同步). 1.NTP原理 NTP[Network Time Protocol]是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击. 先介绍下NTP数据包格式(其标准化文档为RFC2030,NTP版本

ntp ntp协议

在维护网络设备或者linux系统设备的时候,时间同步是非常重要的,如应用程序服务,数据库,等工具都是非常依赖数据库的,一般敏感的时差需要在3s内,普通工具和程序时差也不能超过60s,所以时间服务器是很重要的基础设施. 常用的模式: C/S模式 如图: 请求报文:ntp基于UDP协议传输,应用端口是123端口. 其中(Mode为3表示客户端请求)Mode:长度为3比特,表示NTP的工作模式.不同的值所表示的含义分别是:0未定义.1表示主动对等体模式.2表示被动对等体模式.3表示客户模式.4表示服务

NTP协议详解

NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能.提供NTP对时的服务器有很多,比如微软的NTP对时服务器,利用NTP服务器提供的对时功能,可以使我们的设备时钟系统能够正确运行. NTP报文格式 NTP报文格式如上图所示,它的字段含义参考如下: LI 闰秒标识器,占用2个bit VN 版本号,占用3个bits,表示NTP的版本号,现在为3 Mode 模式,占用3个

ntp服务及时间同步问题

今有一小型项目,完全自主弄,原来以为很简单的NTP服务,我给折腾了2个多小时才整撑头(以前都是运维搞,没太注意,所以这技术的东西,在简单都需要亲尝啊),这里记录为以后别再浪费时间. 目标环境,5台linux centos 6.3, 一台作为NTPD服务与外部公共NTP服务同步时间,同时作为内网的NTPD服务器,其他机器与这台服务做时间同步.  服务器IP 角色   说明 同步方式  192.168.1.135   NTPD服务 1.负责与外部公共NTPD服务同步标准时间 2.作为内外网络的NTP

NTP协议

NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步.NTP基于UDP报文进行传输,使用的UDP端口号为123. 使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用. 对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步. NTP工作原理 NTP的基本工作

NTP服务及时间同步(CentOS6.x)(转载)

今有一小型项目,完全自主弄,原来以为很简单的NTP服务,我给折腾了2个多小时才整撑头(以前都是运维搞,没太注意,所以这技术的东西,在简单都需要亲尝啊),这里记录为以后别再浪费时间. 目标环境,5台linux centos 6.3, 一台作为NTPD服务与外部公共NTP服务同步时间,同时作为内网的NTPD服务器,其他机器与这台服务做时间同步.  服务器IP 角色   说明 同步方式  192.168.1.135   NTPD服务 1.负责与外部公共NTPD服务同步标准时间 2.作为内外网络的NTP

使用NTP进行CentOS7时间同步

NTP时钟同步方式说明 NTP在linux下有两种时钟同步方式,分别为直接同步和平滑同步: 直接同步 使用ntpdate命令进行同步,直接进行时间变更.如果服务器上存在一个12点运行的任务,当前服务器时间是13点,但标准时间时11点,使用此命令可能会造成任务重复执行.因此使用ntpdate同步可能会引发风险,因此该命令也多用于配置时钟同步服务时第一次同步时间时使用. 平滑同步 使用ntpd进行时钟同步,可以保证一个时间不经历两次,它每次同步时间的偏移量不会太陡,是慢慢来的,这正因为这样,ntpd

NTP服务及时间同步(CentOS6.x)(转)

今有一小型项目,完全自主弄,原来以为很简单的NTP服务,我给折腾了2个多小时才整撑头(以前都是运维搞,没太注意,所以这技术的东西,在简单都需要亲尝啊),这里记录为以后别再浪费时间. 目标环境,5台linux centos 6.3, 一台作为NTPD服务与外部公共NTP服务同步时间,同时作为内网的NTPD服务器,其他机器与这台服务做时间同步.  服务器IP 角色   说明 同步方式  192.168.1.135   NTPD服务 1.负责与外部公共NTPD服务同步标准时间 2.作为内外网络的NTP

NTP服务及时间同步(CentOS6.x)

今有一小型项目,完全自主弄,原来以为很简单的NTP服务,我给折腾了2个多小时才整撑头(以前都是运维搞,没太注意,所以这技术的东西,在简单都需要亲尝啊),这里记录为以后别再浪费时间. 目标环境,5台linux centos 6.3, 一台作为NTPD服务与外部公共NTP服务同步时间,同时作为内网的NTPD服务器,其他机器与这台服务做时间同步.  服务器IP 角色   说明 同步方式  192.168.1.135   NTPD服务 1.负责与外部公共NTPD服务同步标准时间 2.作为内外网络的NTP