NTP客户端和服务器实现

在尝试了多种现有的服务器/客户端实现后,由于存在各种问题和兼容性问题,决定自己实现一个。默认情况下,服务器和客户端都不会修改机器时间(尽管它们有能力这样做)。

这个需求来自于在不依赖/影响系统时钟的情况下,对系统上的时间同步机制进行全面控制的需求,同时监控NTP设备排队等待时间。

致谢

一个好的起点是Jakub Parez的NTP-Client项目,可以在找到。

使用代码

C#

ntp::ClientSettings cs; cs.lts = ntp::LocalTimeSource::InternalClock; cs.fta.delta_avg_min = std::chrono::microseconds::min(); cs.fta.delta_stdev_min = std::chrono::microseconds(500); cs.fta.fine_adjustment_duration = std::chrono::seconds(60); cs.error_callback = [](const ntp::IClient& client, std::string error_string, void* userParam) { std::cout << "NTP client error: " << error_string << std::endl; }; cs.warning_callback = [](const ntp::IClient& client, std::string warn_string, void* userParam) { std::cout << "NTP client warning: " << warn_string << std::endl; }; cs.clockset_callback = [](const ntp::IClient& client, ManagedClockPtr new_clock, void* userParam) { std::cout << "NTP client clockset: " << new_clock->now().as_string() << std::endl; }; auto ntp_client = ntp::IClient::create_instance(); ntp_client->init(cs); auto res = ntp_client->query(ep, false);

一旦创建,客户端可以查询给定端点的服务器。

auto ntp_server = ntp::IServer::create_instance(); ntp::IServer::ServerSettings setup; if (use_external_time_source) { auto mng = StartInitClientsManager(false); mng->wait_initialzed(std::chrono::milliseconds(-1)); setup.time_source = mng; } setup.error_callback = [](const ntp::IServer& server, std::string error_string, void* userParam) { std::cout << "NTP server error: " << error_string << std::endl; }; setup.warning_callback = [](const ntp::IServer& server, std::string warn_string, void* userParam) { std::cout << "NTP server warning: " << warn_string << std::endl; }; setup.client_serverd_callback = [](const ntp::IServer& server, std::string client_addr, void* userParam) { std::cout << "NTP server serverd the client " << client_addr << std::endl; }; if (!ntp_server->init(setup)) return false; std::this_thread::sleep_for(std::chrono::hours(10));

关键点

学到的一件事是时间“同步”的复杂性,以及它对各种因素的敏感性。

2023年8月26日,初始版本

2023年11月22日,修复了错误,提高了性能

2023年11月29日,改进了API,支持IP V6,缩短了服务器评估时间,增加了服务器评估方法,枚举以选择准确性而不是更快的评估,使用客户端设置控制协议版本,修复了服务器的根延迟和根分散传输错误,修复了客户端的refid解析错误

2023年12月1日,修复了消息打印缓冲区溢出错误,修复了ping错误,改进了DateTime结构,客户端:为NTP控制消息添加了基本处理(死亡之吻代码)

2023年12月2日,客户端:同步过程错误修复,客户端:添加了平滑时钟调整的选项,客户端:更改了默认设置,ClientsManager:通过回调公开查询结果

2023年12月3日,客户端+服务器:修复了根分散和根延迟错误格式错误。

2023年12月27日,增加了完整的Linux/Ubunto支持。Codeblocks IDE支持。支持NTP时代。小错误修复。

2024年3月3日,改进了跃进指示器处理。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485