Метка времени NTP неправильно проанализирована c ++ - PullRequest
0 голосов
/ 26 октября 2019

Я хочу отправить запрос SNTP, а затем проанализировать ответ, поэтому я начал с создания метки времени, преобразовав ее в ntp, а затем попытался прочитать секунды и дробную часть. Проблема в том, что секция секунд не всегда правильно анализируется, всегда сдвигается на несколько секунд. Вот что я сделал:

#include <stdio.h> 
#include <stdlib.h>
#include <stdint.h>
#include <iostream>    // Needed to perform IO operations
#include <ctime>

constexpr auto SECONDS_SINCE_FIRST_EPOCH = (2208988800ULL);
constexpr auto NTP_SCALE_FRAC = (4294967296ULL);

using namespace std; 
int main() 
{ 

    std::time_t _timeEpoch = std::time(nullptr);
    unsigned long long tv_ntp, tv_usecs, tv_time;
    tv_ntp = _timeEpoch + SECONDS_SINCE_FIRST_EPOCH; 
    tv_usecs = (NTP_SCALE_FRAC * _timeEpoch) / 1000000UL;
    tv_time = (tv_ntp << 32) | tv_usecs;

    std::cout << "GetUtcTimeMilliSeconds UTC sec: " << _timeEpoch << " 1900: " << tv_ntp << " fraction of second " << tv_usecs << " tv_time " << tv_time << std::endl;

    uint32_t msw = (tv_time >> 32) & 0xFFFFFFFF;
    uint32_t lsw = tv_time & 0xFFFFFFFF;

    std::cout << "GetUtcTimeMilliSeconds msw " << msw << " lsw: " << lsw << std::endl;  

    return 0; 
} 

Я ожидал, что msw будет равен tv_ntp, а lsw - tv_usecs, но они не

GetUtcTimeMilliSeconds UTC sec: 1572103823 1900: 3781092623 fraction of second 6752134505701 tv_time 16239671495839982821
GetUtcTimeMilliSeconds msw 3781093167 lsw: 445916389
...