Thanks Ton Plooij for your links.
Below I would like to share the code which finally worked well for me.
Both functions provides UTC time in nanoseconds.
First is based on system time, while the second performs query to NTP server time.
#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <time.h>
time_t getTimeLocal()
{
return 1000000000 * time(NULL);
}
time_t getTimeRemote()
{
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("200.20.186.76");
server_addr.sin_port = htons(123);
protoent *proto = getprotobyname("udp");
int s = socket(PF_INET, SOCK_DGRAM, proto->p_proto);
char msg[48] = { 0x08, 0, 0, 0, 0, 0, 0, 0, 0 };
sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &server_addr, sizeof(server_addr));
memset(msg, 0, sizeof(msg));
struct sockaddr saddr;
socklen_t saddr_l = sizeof(saddr);
recvfrom(s, msg, 48, 0, &saddr, &saddr_l);
closesocket(s);
time_t rawtime = ntohl(*(u_long *) &msg[40]) - 2208988800U;
return 1000000000 * rawtime;
}
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
printf("UTC time:\n");
printf("system: %llu [nsec]\n", getTimeLocal());
printf("server: %llu [nsec]\n", getTimeRemote());
WSACleanup();
getchar();
return 0;
}