NTP网络授时系统设计与实现——客户端时钟同步软件设计与实现_第1页
NTP网络授时系统设计与实现——客户端时钟同步软件设计与实现_第2页
NTP网络授时系统设计与实现——客户端时钟同步软件设计与实现_第3页
NTP网络授时系统设计与实现——客户端时钟同步软件设计与实现_第4页
NTP网络授时系统设计与实现——客户端时钟同步软件设计与实现_第5页
已阅读5页,还剩12页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 客户端时钟同步软件设计与实现5.1 概述在 NTP 网络授时系统中,各子网中的路由器可从 NTP 服务器获取标 准时 间,并为其它终端用户提供授时服务。同时,其它终端用户也可以直接从 NTP 服务器获取标准时间。 NTP 网络授时系统的时钟同步软件 ,即部署在需通过网 络获取精确时间的各 windows 终端上。 时钟同步软件共包括三 个 功能模块:系 统管理、定时器和时钟获取与校正。系统管理模块,用于设置作为时钟参照的 NTP 服务器的地址、每次对时发 送 NTP 报文的次数、对时间隔等参数。定时器模块,用于定时或手工发起时钟同步请求。在通常状况下,系统按 用户设置的对时间隔,自动与

2、 NTP 服务器进行时间同步。在需要的 时候,也可 以由用户进行手工同步时间获取与校正模块:用于根据系统指定的参数,构造 NTP 消息报 文,从 NTP 服务器获取精确的标准时间。系统根据时钟同步的方 式 (手工或定时)本 地时间,使系统内部各个节点的时钟保持一致。任意一个时钟同步客户端发起时钟同步消息,授时服务器返回系统时钟信息,客户端根据时钟信息调整本地时间。5.2 时钟同步软件静态 结构图5.2.1 时钟同步软 件整体结构 时钟同步软件中,定时同步与手工同步的流程基本相同,系统的整体结构 如下图所示:参数设置时间获取时钟校正玄结:咗生【I图5-1 时间同步的整体模型结构图5.2.2时钟同

3、步软件的类图分析时钟同步软件的结构,进一步细化系统中各种对象,以完成对系统中 的类进行定义。SVSTEMTIMESynTflsK a 珅AddrMBwMonth唸Jnim阳1*SynC 乩KIfwHour*g&tAMrM4()M 初 irul*iAlMreS4()wSecandmMillnecandsaOnlfirwhi *Oisck(*SY&TEMWE()J*Run()C orstruckPacket曲Pall PrscisionRoolDel By致XiTimeTrartfiTime*GanstnickPaQlcEii| edOrilime *getOriiirne(i getIke 諮g

4、siriaraTinnao sertRecTimaf 凯打 acsTirra口SynSerrM 咻询空晦k 傅 Ccrsi ruck Pacicoi*Sy nSewt)*Rfi+pjl:li 蓟仆*5 盯 flpKllH门SnC hertt 打酩ef#Srwr7imeBaekTimfig邑血 *&e:ofteEirO *Comp0fl3( *gdSmerTinieO*seifiac.Mirne准准准准:Clock1: synClock()SynClient 3: returnLocalClock():returnSynMsg() :user5: returnClock()4: getClock

5、():SynServer2: getLocalClock。图5-7手工同步的协作图5.4时间获取与校正模块的实现5.4.1总体实现时间获取与校正模块是时钟同步软件的核心,其主要任务是向网络中的NTP服务器发送时钟同步请求并接收服务器返回的带有时间戳的NTP报文,计算网络延时和时间偏差,修正本地主机的系统时间时间获取与校正的主要流程如下所示。开始创建SOCKET操作成功?NO告警请求连接connect操作成 功?I丄/发送图5-8时间获取与校正流程图5.4.2时钟获取与校正的关键技术点时钟同步模块与授时模块的运行环境不同,部署在wi ndows操作系统上,在此用C#编程实现。其实现的要点有:1.

6、 NTP报文的封装根据NTP报文的格式,客户端首选构建一个 NTP报文,其主要字段的设 置如下:表5-1客户端NTP报文时间戳设置字段名称值LI00VN3Mode3Stratum2Poll忽略Precisi on忽略Root Delay忽略表5-1 客户端NTP报文时间戳设置(续表)字段名称值Root Dispersion忽略Referenee Identifier忽略Referenee Timestamp忽略Originate Timestamp忽略Receive Timestamp忽略Transmit Timestamp取报文发送时间Authe nticator可选其中,传送时间戳Tran

7、smitTimestamp的获取代码段如下:DateTime t1900 = Convert.ToDateTime(1900-01-01 00:00:00);long tick1900 = t1900.Ticks;long tick = DateTime.Now.Ticks;long s1900= (tick - tick1900)-36000000000*8)/10000000;long s1900s = (tick - tick1900) - 36000000000 * 8) % 10000000; byte temp = BitConverter.GetBytes(s1900);for

8、(int j = 0; j 4; j+)Packet40 + j = temp3-j ;temp = BitCo nverter.GetBytes(s1900s);for (int k = 4; k 8; k+)Packet40 + k = temp7 - k;因为UTC时间表示为当前与1900年1月1日0时相关的秒数,而在C#中, 时间的Ticks属性获取的是与公元元年1月1日0时的时间差,计数单位是毫 微 秒,故先取得1900年第一天的Ticks值,再获取当前时间的Ticks值,两者 相减, 并除以一个系数,其值与余数就分别为 UTC时间的整数和小数部分。Transmit Timestam

9、p时间戳用8个字节64位表示,其中前32位表示秒数的整 数部分,后 32位表示秒数的小数部分。2. 与服务器间的socket通讯网络编程要用到的两个命名空间29是System.Net和System.Net.Sockets System.Net命名空间通常与较高层的操作有关,例如 down load或upload,试用HTTP和其他协议进行 Web请求等等,而System.Net.Sockets命名空间所包含的类通常与较低层的操作有关。如果要直接 使用Sockets或者TCP/IP之类的协议,这个命名空间的类是非常有用的。在.Net中,System.Net.Sockets命名空间为需要严密控制网

10、络访问的开发 人员提供了 Windows Sockets(Winsock)接口的托管实现。System.Net命名空 间中的所有其他网络访问类都建立在该套接字Socket实现之上。在应用程序端或者服务器端创建了 Socket对象之后,就可以使用Sen d/Se ntTo方法将数据发 送到连接的Socket或者使用Receive/ReceiveFrom方法接收来自连接 Socket的 数据。针对Socket编程,.NET 框架的Socket类是 Winsock32 API提供的套接 字服务的托管代码版本30 o其中为实现网络编程提供了大量的方法,大多数情 况下,Socket类方法只是将数据封送到

11、它们的本机Win32副本中并处理任何必要的安全检查。在使用之前,你需要首先创建 Socket对象的实例,这可以通过 Socket类 的构造方法来实现:Public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);其中,addressFamily参数指定 Socket使用的寻址方案,socketType参数 指定Socket的类型,protocolType参数指定 Socket使用的协议。在本系统中,NTP客户端使用UDP方式与服务器通信,所以在创建Socket实例时,用的是S

12、ocket的无连接的数据报形式:Socket temp = new Socket(AddressFamily.I nterNetwork, SocketType.Dgram, ProtocolType.Udp);由于UDP是一种无连接的协议,因此,为了使应用程序能够发送和接收UDP数据包,需要两 个步骤:1. 创建一个Socket对象;2. 将创建的Socket对象与本地IPEndPoint进行绑定。经过这两步,创建的Socket对象就能够在IPEndPoint上接收流入的UDP 数据包,或者将流出的UDP数据包发送到网络中任意其他设备上。使用 UDP 通信时,不能使用标准的 Send()和R

13、eceive()方法,须使用另外的 SendTo()和 ReceiveFrom(方 法。在客户端使用Socket通信,因为客户机不需要在指定的UDP端口等待流入的数据,因此,不必要使用Bin d()方法,而是使用在数据发送时系统随机指定的一个UDP端口,也使用同一个端口 来接收返回的消息。UDP客户机程序 首选定义一个IPEndPoint, UDP服务器将发送数据包到这个IPEndPoint。本系统客户端Socket通信功能的代码片断如下:trymyIP = IPAddress .P arse(TBip.Text);catch MessageBox.Show(IP 地址不正确,请重新输入!);

14、 tryBTse nd.E nabled = true;myServer = new IPEndPoint(mylP, 123);创建一个Socket实例sksk = new Socket(AddressFamily.lnterNetwork, SocketType.Dgram, ProtocolType.Udp);catch (Exception ee) MessageBox.Show(ee.Message); 构造NTP消息包ConstructPacket pk = new ConstructPacket();data = pk.Packet;发送NTP消息包sk.SendTo(data,

15、 data.Length, SocketFlags.None, myServer);/接收服务器返回的NTP消息包sender= new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)sender;byte rdata = new byte256;int recv = sk.ReceiveFrom(rdata, ref Remote);其中,SendTo()方法指定要发送的数据和目标机器的IPEndPoint。ReceiveFrom()方法同 SendTo()方法类似,但是使用 EndPoint 对象 声明的方式不一样,利用r

16、ef修饰,传递的不是一个 EndPoint对象,而是将参 数传递给一个EndPoint对象。3. 本地时钟的获取与设置在网络授时系统的客户端,发起时钟同步请求时,首先要获取本地时钟,在收到服务器返回的NTP报文后,要计算出本地时钟与标准时钟的偏差,然后对本地时钟进行校正,将其时间设置为标准时间。本系统在.NET架构的C#环境下开发,对本地时间的获取和设置分别采用 了两种不同的方式。1. 获取本地时钟,可以直接创建一个DateTime类的实例,然后用DateTime.Now属性,即可得到本地时间。但是本系 统需要的是UTC时 间,所以不必直接获取本地时间,而是通过DateTime对象的Ticks

17、属性来获取时间差,并通过必要时间基准和时区的转换,得到NTP报 文所需要的UTC时间。这段功能代码在上面 Transimit Timestamp时间戳 的获取代码中已经包含,在此不再重复。2. 设置本地时钟。在 C#中,与时间相关的类中没有合适的直接设置本地时间的方法,本系统设置时间通过调用Win32 API的SetSystemTime函数来实现。首先,必须定义对SetSystemTime函数的调用声明:Dlllmport(kernel32.dll)private extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime);然后定

18、义一个要传递给本机方法并从本机方法接收的结构。private struct SYSTEMTIMEpublic ushort wYear;public ushort wMonth;public ushort wDayOfWeek;public ushort wDay;public ushort wHour;public ushort wMinute;public ushort wSecond;public ushort wMillisec on ds;J最后,将通过NTP时钟同步计算出的标准时间赋值到SYSTEMTIME结构的一个实例,直接调用 SetSystemTime设置即可。private void SetTime()SYSTEMTIME systime= new SYSTEMTIME();将标准时间赋值到systime对象代码略/设置本地时间SetS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论