为了实现内网间机子的时钟同步,需要用到NTP协议的,所以做了一下这方面工作。
实现获取指定IP系统时间的代码在网上有现成的:
这里有一个网友提供的免费下载的地址:http://wenku.baidu.com/view/07d8aad53186bceb19e8bb25.html
var client = new SNTPTimeClient("127.0.0.1", "123"); client.Connect(); DateTime getEd = client.ReceiveTimestamp;//获取指定IP的系统时间 var st = new SystemTime { wDay = (ushort)getEd.Day, wDayOfWeek = (ushort)getEd.DayOfWeek, wHour = (ushort)getEd.Hour, wMiliseconds = (ushort)getEd.Millisecond, wMinute = (ushort)getEd.Minute, wMonth = (ushort)getEd.Month, wSecond = (ushort)getEd.Second, wYear = (ushort)getEd.Year }; SNTPTimeClient.SetLocalTime(ref st);//设置本地时间
注:
1、NTP基于UDP报文进行传输,使用的UDP端口号为123。
2、指定的IP可以是公网的IP,下面是一些网络上提供的时间服务器IP地址。
210.72.145.44
203.117.180.36
131.107.1.10
64.236.96.53
130.149.17.21
66.92.68.246
18.145.0.30
137.92.140.80
133.100.9.2
128.118.46.3
210.72.145.44(中国国家授时中心服务器IP地址)
202.120.2.101 (上海交通大学网络中心NTP服务器地址)
3、也可以内网局域网的,但是我测试的时候,出现了以下几个错误(win7下的操作):
1、远程主机强迫关闭了一个现有的连接。
解决办法:运行 -- services.msc -- 找到Windows Time并开启。你也可以设置他的属性为自动的。
2、由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
解决办法:
1、有可能是指定IP的主机的NTP服务没有开启,运行 -- gpedit.msc -- 计算机配置 -- 管理模版 -- 系统 -- windows时间服务 --时间提供程序,在右侧找到“启用 Windows NTP 服务器”双击选择--“已启用”-- 确定,可以参照下面给出下载链接里的PDF文件。
2、有可能是指定IP的主机的Windows Time服务没有开启。解决方法如上面。
3、有可能是指定IP的主机的防火墙阻止了123端口,控制面板--防火墙--入站规则--右侧一栏点击新建规则--端口--UDP--特定本地端口:123-- 允许链接--全选--随便取个名字。确定开启。
源码及文档下载:http://download.csdn.net/detail/wushang923/5514821
下载内容(大部分本文已给出):
1、SNTP时钟同步,获取指定IP主机系统时间并设置本地时间的程序源码。
2、客户端调用方法。
3、winXP及win7下开启NTP服务方法.pdf
4、NTP协议格式(中文).doc