[ntp:questions] Re: Question about synchronizing client and server clock

Terje Mathisen terje.mathisen at hda.hydro.com
Mon Jan 5 22:09:00 UTC 2004


Danny Mayer wrote:
> If you are using Windows, I might suggest looking at two functions
> SystemTimeToFileTime() and FileTimeToSystemTime(). Do your calculations
> using FileTime which provides 64-bit integers though you have to copy
> it to a ULARGE_INTEGER structure to do that. If you want to use ntp code
> itself there is are two undocumented Win32 API functions in the IPHLPAPI DLL
> called NTPTimeToNTFileTime() and NTTimeToNTPTime(). Unfortunately I don't
> know the arguments to the calls.

Those two should be relatively trivial:

NT's _ftime counts 100 ns intervals, starting from 1600 (?), so a 
quick&dirty conversion can use fp operations to make life easy:

int64_t ntp2nt(uint32_t ntphi, uint32_t ntplo)
{
   int64_t t = ntphi;
   double tl = (double) ntplo;

   t = t * 10000000 + (int32_t) (tl * (1e7 / (65536.0*65536.0)));

   t += EPOCH_OFFSET;

   return t;
}

The opposite operation is similar, but easier to handle with integer ops 
only:

void ntp2nt(int64_t nt, uint32_t *ntphi, uint32_t *ntplo)
{
   uint32_t h, l;

   nt -= EPOCH_OFFSET;

   h = (uint32_t) (nt / 10000000);  // Seconds, can truncate!
   nt -= h * (int64_t) 10000000;	// Fraction in NT units

   l = (uint32_t) ((nt << 32) / 10000000);

   *ntphi = h;
   *ntplo = l;
}

Terje
-- 
- <Terje.Mathisen at hda.hydro.com>
"almost all programming can be viewed as an exercise in caching"



More information about the questions mailing list