我需要使用gettimeofday计算ntp时间戳。下面是我如何使用方法注释来实现的。你们觉得还不错吧?(减去错误检查)。另外,这里有一个codepad链接。
#include <unistd.h>
#include <sys/time.h>
const unsigned long EPOCH = 2208988800UL; // delta between epoch time and ntp time
const double NTP_SCALE_FRAC = 4294967295.0; // maximum value of the ntp fractional part
int main()
{
struct timeval tv;
uint64_t ntp_time;
uint64_t tv_ntp;
double tv_usecs;
gettimeofday(&tv, NULL);
tv_ntp = tv.tv_sec + EPOCH;
// convert tv_usec to a fraction of a second
// next, we multiply this fraction times the NTP_SCALE_FRAC, which represents
// the maximum value of the fraction until it rolls over to one. Thus,
// .05 seconds is represented in NTP as (.05 * NTP_SCALE_FRAC)
tv_usecs = (tv.tv_usec * 1e-6) * NTP_SCALE_FRAC;
// next we take the tv_ntp seconds value and shift it 32 bits to the left. This puts the
// seconds in the proper location for NTP time stamps. I recognize this method has an
// overflow hazard if used after around the year 2106
// Next we do a bitwise OR with the tv_usecs cast as a uin32_t, dropping the fractional
// part
ntp_time = ((tv_ntp << 32) | (uint32_t)tv_usecs);
}
发布于 2010-04-15 10:20:47
这里不需要使用uint64_t
- unsigned long long
保证至少64位宽。
您也不需要往返于double
之间,因为NTP_SCALE_FRAC * 1000000
很容易放入unsigned long long
中。
EPOCH
应该是unsigned long long
,而不是unsigned long
,这样与tv.tv_sec
的添加就不会回绕。
全部完成:
const unsigned long long EPOCH = 2208988800ULL;
const unsigned long long NTP_SCALE_FRAC = 4294967296ULL;
unsigned long long tv_to_ntp(struct timeval tv)
{
unsigned long long tv_ntp, tv_usecs;
tv_ntp = tv.tv_sec + EPOCH;
tv_usecs = (NTP_SCALE_FRAC * tv.tv_usec) / 1000000UL;
return (tv_ntp << 32) | tv_usecs;
}
发布于 2012-05-21 00:37:09
extern uint64_t tvtontp64(struct timeval *tv) {
uint64_t ntpts;
ntpts = (((uint64_t)tv->tv_sec + 2208988800u) << 32) + ((uint32_t)tv->tv_usec * 4294.967296);
return (ntpts);
}
我使用4294.967296不是...5,因为它是总计数的一个比率,0需要被计数为每秒4294967296刻度或每微秒4294.967296它很容易验证这一点,因为1000000微秒将是一个溢出到秒,刻度的范围应该是0到(1000000-1)。
这是一个简化,适合我的目的唯一的本地IPv6单播地址RFC4193
https://stackoverflow.com/questions/2641954
复制相似问题