Мне нужно вычислить метку времени ntp, используя gettimeofday. Ниже приведен пример того, как я это сделал с комментариями к методу. Хорошо выглядеть вам, ребята? (минус проверка ошибок). Кроме того, вот ссылка codepad.Создайте временную метку ntp с gettimeofday
#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);
}
Могу ли я спросить, почему вы умножаете tv_usec с NTP_SCALE_FRAC? для меня, кажется, trasnforming usec для pico секунд (* 10^6) должно быть достаточно, может быть, я чего-то не хватает? – 2010-05-19 16:34:18
В NTP, если я правильно понимаю, часть дроби представляется в виде доли от всех возможных значений. Так что это не 1 к 1. Например, если я представляю одну секунду в 1000 частях, то кто-то дает мне значение 0,5 секунды с базой 60, мне придется масштабировать ее до моей базы 1000. С NTP базой является 32-битное представление, в которое оно преобразуется. Итак, 1 секунда = 2^32 ntp доли секунды. – jkyle
Спасибо, я это понимаю. Для меня не очевидно, почему tv_usecs = (NTP_SCALE_FRAC * tv.tv_usec)/1000000UL выполняет эту работу? – 2010-05-20 12:20:59