65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 Winsock 通过 Internet 时间服务器设置系统时钟

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.67/5 (3投票s)

2005年3月21日

2分钟阅读

viewsIcon

53067

downloadIcon

2196

使用 Winsock UDP 设置系统时钟。

Sample Image

引言

本文档描述了一个程序查询 Internet 服务器以获取正确时间的方法,并且该时间报告可用于设置您的计算机时钟。 使用 RFC868 协议的时间服务器的精度为一秒。 它非常准确,但除非您在服务器时钟跳转到下一秒后立即查询服务器,否则您的时钟设置可能会相差一秒。(使用此方法设置您的时钟总是会慢,最多 - 但不超过 - 整整一秒。)

将程序放置在您计算机上的任何文件夹中。 程序中只有一个文件,RFC868.EXE。 该名称来自名为 RFC868(征求意见稿 #868)的文档。

背景

此程序旨在解决我在构建我的另一个程序(一个数字时钟)时遇到的问题。 我想查询 Internet 时间服务器来设置系统时钟。 RFC1305,尤其是更相关的 SNTP 看起来正是我想要的,但不幸的是,它们目前超出了我的理解范围。 尝试在网上找到实现这个更简单的 RFC868 的 Winsock 代码并不容易,所以我最终转换了在Windows Sockets Network Programming 一书中找到的 UA_TIME.C 程序(为拨号 RFC867 编码),以使用 RFC868 格式运行。 我希望其他处境相似的人发现这段代码有用。 任何知道如何实现 SNTP 客户端的人特此恳请告知我方法。 谢谢。

使用代码

如何将 Winsock 库包含到项目的编译中

  1. 单击工具栏上的类视图图标。
  2. 右键单击该项目的图标。
  3. 选择“属性”。
  4. 在“属性页”对话框中,选择“链接器”。
  5. 选择“命令行”。
  6. 在“附加选项”框中键入“/DEFAULTLIB:Ws2_32.lib”(不带引号)。
  7. 您需要为调试和发布版本都执行此操作。

关注点

在这里我可以有机会说明项目中是否有有趣或好玩的事情。 嗯,是的,有一些; 我想说这是相当偶然的。 一段时间以来,我一直在想 APP 如何启动默认浏览器来访问 Internet 站点等等。 答案? ShellExecute()。 奇怪的是,有关此函数的文档并未过多提及它可以做的那些美妙的事情。 我只是想知道它有多强大。 代码示例

case ID_HELP_GNULICENSEAGREEMENT:
  nRet = (int)ShellExecute(hWnd, "open", 
              "https://gnu.ac.cn/copyleft/gpl.html", 
              NULL, NULL, SW_SHOW);
  if (nRet < 33)
      MessageBox(hWnd, "Sorry, couldn't open the GNU web page.", 
                      "RFC868 Client", MB_OK | MB_ICONQUESTION);
  break;

还有一些烦人的事情。 我不喜欢警告,并喜欢尽可能消除它们,但在这里的这个例子中,到目前为止我还没有成功。 ShellExecute() 前面的 (int) 转换似乎是必要的,因为该函数返回一个 HINSTANCE 句柄。 然而,即使使用转换,警告仍然存在。

历史

版本 1.00。

© . All rights reserved.