在尝试了多种现有的服务器/客户端实现后,由于存在各种问题和兼容性问题,决定自己实现一个。默认情况下,服务器和客户端都不会修改机器时间(尽管它们有能力这样做)。
这个需求来自于在不依赖/影响系统时钟的情况下,对系统上的时间同步机制进行全面控制的需求,同时监控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日,改进了跃进指示器处理。