arrow Open Source Projects

libnetclock

libnetclock is a modern C++ NTP client library with full std::chrono compatibility for precise network time synchronization.

gitlab Source

Docs Docs

License MIT license

libnetclock

SHARE

linkedin share twitter share reddit share

About

libnetclock is a lightweight, modern C++ library that provides Network Time Protocol (NTP) client functionality with seamless integration into the standard std::chrono ecosystem. Designed for applications requiring precise time synchronization, it offers microsecond-level accuracy while maintaining a clean, type-safe API.

An attractive screenshot of the example code from the repo

Key Features

  • 🕒 std::chrono Integration: Native support for std::chrono::time_point and duration types
  • ⚡ High Precision: Microsecond-level timestamp accuracy with sub-millisecond network compensation
  • 🔧 Easy Integration: Clean CMake integration with pkg-config support
  • 🌐 Cross-Platform: Compatible with Linux, Windows, and macOS
  • ðŸ“Ą NTP v4 Compliant: Full RFC 5905 compliance with SNTP support
  • ðŸ›Ąïļ Thread-Safe: Designed for concurrent access and multi-threaded applications
  • 📊 Network Diagnostics: Built-in round-trip time measurement and jitter analysis
  • ðŸŽŊ Modern C++: Leverages C++17 features for clean, efficient code

Requirements

  • Compiler: C++17 compatible compiler (GCC 7+, Clang 5+, MSVC 2017+)
  • Platforms: Linux, Windows, macOS
  • Build System: CMake 3.19+
  • Dependencies: Boost libraries (system, asio)

Performance Characteristics

libnetclock is designed for high performance and low latency:

  • Query Time: Typically 1-50ms depending on network conditions
  • Memory Usage: ~12KB per NTPClient instance (including Boost overhead)
  • Binary Size: ~150KB static library, ~80KB shared library (excluding Boost)
  • CPU Overhead: Minimal, leverages Boost’s efficient networking
  • Accuracy: Sub-millisecond precision under good network conditions

Benchmark Results

Platform: Linux x64, GCC 11.2, Boost 1.74+
Network: Gigabit Ethernet, <1ms to NTP server

Single Query: ~2ms average Batch 100 Queries: ~150ms total Memory per Client: 11.5KB Binary Size: 145KB (static, excluding Boost) CPU Usage: <0.1% during queries

Thread Safety

libnetclock is designed to be thread-safe:

  • NTPClient: Thread-safe for concurrent queries
  • NTPStats: Immutable after construction

Comparison with Alternatives

Featurelibnetclockchrony
LanguageC++C
std::chrono Support✅ Native❌
Easy Integration✅ CMake⚠ïļ System
DependenciesBoostMany
PrecisionΞsns
Cross-platform✅✅
Binary Size150KB+500KB+

FAQ

Q: How accurate is libnetclock compared to system NTP daemons?

A: libnetclock achieves microsecond-level accuracy under good network conditions. While dedicated NTP daemons like chronyd can achieve nanosecond precision with specialized hardware, libnetclock is ideal for applications requiring precise time without system-level dependencies.

Q: Can I use libnetclock to set the system clock?

A: libnetclock is designed for time measurement and synchronization within applications, not system clock adjustment. For system-level time setting, use dedicated tools like ntpdate or chrony.

Q: Does libnetclock work behind firewalls?

A: Yes, libnetclock uses UDP port 123 (standard NTP port). Ensure your firewall allows outbound UDP traffic on this port.

Q: Is libnetclock suitable for high-frequency trading applications?

A: libnetclock provides excellent precision for most applications. For ultra-low latency requirements, consider hardware-based solutions or kernel-bypass networking.

Dependencies

License

libnetclock is licensed under the MIT license

Support

This is a free library licensed under the MIT license, if you notice a bug or have a feature request please raise a ticket in GitLab, and we’ll do our best to support you. If you need priority support or wish to fast-track a feature request, you’re welcome to engage us to answer your request.

arrow Open Source overview