用程序获取 Internet 时间 无通用性程序后的暂用办法

并不是完全失败,但没找到一个通用的办法,这个通用指的不能通用所有的时间服务器,而不是说操作系统。

网上的方案很多,有用Socket类、或TcpClient类(C#)、或UdpClient类,端口有使用13的、或37、或123或更多。时间服务器列表就更多了。

但我实现测试过,多种组合后,总是不通用,可能端口13会可以,但换台服务器就要123,而且取时总是不稳定,这次取到,下次就停掉不给数据了,我分析这可能是网站为避免攻击而做的限制。

但有个很是羡慕的事情,是俺的Window7,每次都能成功取时,点多次也成功,而且更换时间服务器列表也没关系。

于是在查找了更多文档,还是没查到一种通用的办法,想到是否会有一个API的方法,结果没有,想来更新时间从Inet还是略新的功能,以前XP好象没有,MS没有来得及封装它。在最后,终于找到一个“底层”的方法,用命令行,^_^!!  W32tm.exe 。可行在程序里运行(加不显示窗口参数):w32tm /resync /nowait

怎么能知道系统更新了时间没有,不用看右下角,可以在程序写一行:

Microsoft.Win32.SystemEvents.TimeChanged += (sender, e) => ShowInfo("system time changed, now: {0}", DateTime.Now);

这样做不论是手点右下角更新的,还是另外程序更新,程序里都会有显示,这样就放心啦。具体这个命令使用哪个服务器更新,并没有显示,经过我的测试发现它是使用手动更新调整时间服务器器列表的首项,所以可以用手工先更新一下,以后就不用动了。

再注意: nowait 控制参数,会使得更新延后,使用以上事件监控,我发现我这有5秒之多,当然系统会自动计算网络耗时的,不多说了。

再注意:调用其的App要有Admin权限,否则会报错,怎么把程序加盾图标不用说了吧。

我想这种看上去容易的问题,花了我一上午时间去找,哪位兄弟如果知道Windows哪个API可用,或是有标准的时间通讯协议(socket),请告诉我。

相关的文档:

How the Windows Time Service Works

A list of the Simple Network Time Protocol (SNTP) time servers that are available on the Internet

How do I use pool.ntp.org?

C#获取Internet服务器的时间 (这篇不错,端口是123的,但也是不能通用)

上一篇:web.xml 部署描述符元素


下一篇:LRU与MRU算法