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






2.67/5 (3投票s)
2005年3月21日
2分钟阅读

53067

2196
使用 Winsock UDP 设置系统时钟。
引言
本文档描述了一个程序查询 Internet 服务器以获取正确时间的方法,并且该时间报告可用于设置您的计算机时钟。 使用 RFC868 协议的时间服务器的精度为一秒。 它非常准确,但除非您在服务器时钟跳转到下一秒后立即查询服务器,否则您的时钟设置可能会相差一秒。(使用此方法设置您的时钟总是会慢,最多 - 但不超过 - 整整一秒。)
将程序放置在您计算机上的任何文件夹中。 程序中只有一个文件,RFC868.EXE。 该名称来自名为 RFC868(征求意见稿 #868)的文档。
背景
此程序旨在解决我在构建我的另一个程序(一个数字时钟)时遇到的问题。 我想查询 Internet 时间服务器来设置系统时钟。 RFC1305,尤其是更相关的 SNTP 看起来正是我想要的,但不幸的是,它们目前超出了我的理解范围。 尝试在网上找到实现这个更简单的 RFC868 的 Winsock 代码并不容易,所以我最终转换了在Windows Sockets Network Programming 一书中找到的 UA_TIME.C 程序(为拨号 RFC867 编码),以使用 RFC868 格式运行。 我希望其他处境相似的人发现这段代码有用。 任何知道如何实现 SNTP 客户端的人特此恳请告知我方法。 谢谢。
使用代码
如何将 Winsock 库包含到项目的编译中
- 单击工具栏上的类视图图标。
- 右键单击该项目的图标。
- 选择“属性”。
- 在“属性页”对话框中,选择“链接器”。
- 选择“命令行”。
- 在“附加选项”框中键入“/DEFAULTLIB:Ws2_32.lib”(不带引号)。
- 您需要为调试和发布版本都执行此操作。
关注点
在这里我可以有机会说明项目中是否有有趣或好玩的事情。 嗯,是的,有一些; 我想说这是相当偶然的。 一段时间以来,我一直在想 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。