zoukankan      html  css  js  c++  java
  • 用程序获取 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的,但也是不能通用)

  • 相关阅读:
    替换URL传递的参数
    执行SQl语句得到xml结果集
    table中文本太长换行
    org.xml.sax.SAXNotRecognizedException
    WAMP+CMSeasy快速搭建学校网站
    推荐几个web前台开发的小工具
    来园子里注册啦
    C++ Virtual的背后
    Games101观后补充笔记
    Lua语法入门
  • 原文地址:https://www.cnblogs.com/inet/p/3415500.html
Copyright © 2011-2022 走看看