什么是两台机器之间时间戳的最佳 c++ chrono 函数

Posted

技术标签:

【中文标题】什么是两台机器之间时间戳的最佳 c++ chrono 函数【英文标题】:what is the best c++ chrono function to timestamp between two machines 【发布时间】:2019-04-04 07:13:54 【问题描述】:

我发现this question 与 chrono time_since_epoch() 函数相关。通过该线程中给出的答案,我们可以在多个平台的同一台机器上实现时间戳。我有两台机器,它们以微秒为单位显示两个不同的 time_since_epoch()。我需要为从一台机器发送到另一台机器的数据包加上时间戳,以计算该数据包的延迟。

目前我用过

    uint64_t usCurrentTime = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); 

函数以微秒为单位获取自纪元以来的当前时间。但是由于我将其保存在 uint64_t 中,因此延迟正在下溢。这是因为两台机器都没有时间同步。如何使用 chrono 库函数满足我的需求

【问题讨论】:

我发现这个链接很有用:unix.stackexchange.com/questions/218907/… 【参考方案1】:

没有您可以随时访问的时间戳来确保接收者的时间戳大于发送者的时间戳。产生可以在机器之间进行有意义比较的值的唯一时钟是system_clock,即“系统时间”,即您的 PC 显示为当前时间的时间;他们不需要同步。你必须变得更聪明。

C++20 将提供tai_clockutc_clockgps_clock,其中一个很可能满足您的需求(但糟糕的同步仍可能导致负时间戳差异!)。

一种可能的方法:机器 1 向机器 2 发送一个带有std::chrono::high_resolution_clock 时间戳的数据包。机器 2 将其送回。机器 1 接收到返回的数据包,并将接收到的时间戳与std::chrono::high_resolution_clock::now() 进行比较,然后除以 2。

【讨论】:

我真的很喜欢这个答案的前两段。为此目的使用high_resolution_clock 就像两个人同步两个不同的秒表,同时在每个秒表启动时保密。 @HowardHinnant 我试图描述的算法是第 1 个人向第 2 个人发送秒表,第 2 个人将秒表发回,然后第 1 个人查看秒表的内容。机器 2 正在发回它收到的确切数据包,其中包含机器 1 时间戳;机器 1 可以有意义地将该时间戳与新的 high_resolution_clock 时间戳进行比较。我想?我错过了什么吗? 哦,我明白了。您可以通过仅比较一侧的时间戳来获得往返延迟。我误解了。是的,这似乎是合理的。【参考方案2】:

也许同一局域网中的第三台机器可以作为时间戳源,另外两台机器在消息中接收它的时间戳并计算时间戳差异。

【讨论】:

以上是关于什么是两台机器之间时间戳的最佳 c++ chrono 函数的主要内容,如果未能解决你的问题,请参考以下文章

手把手写C++服务器(14):基于UDP测量两台机器之间的网络延迟

使用 recv() 确定数据包大小的最佳方法是啥?

如何通过socket编程在两台机器之间发送文件?

ROS 时间同步问题

将三个具有唯一时间戳的数据库表匹配的最佳方法是啥?

在C中的两台服务器之间传递数据的最佳方式?