Skip to content

Instantly share code, notes, and snippets.

@bcr
Created June 7, 2023 19:14
Show Gist options
  • Save bcr/45fa16f6641740efdfb6156725187eee to your computer and use it in GitHub Desktop.
Save bcr/45fa16f6641740efdfb6156725187eee to your computer and use it in GitHub Desktop.
C# NTP Code
using System.Net;
using System.Net.Sockets;
// https://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c
static DateTime GetNetworkTime()
{
const string ntpServer = "pool.ntp.org";
var ntpData = new byte[48];
ntpData[0] = 0x1B; //LeapIndicator = 0 (no warning), VersionNum = 3 (IPv4 only), Mode = 3 (Client Mode)
var addresses = Dns.GetHostEntry(ntpServer).AddressList;
var ipEndPoint = new IPEndPoint(addresses[0], 123);
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Connect(ipEndPoint);
socket.Send(ntpData);
socket.Receive(ntpData);
socket.Close();
ulong intPart = (ulong)ntpData[40] << 24 | (ulong)ntpData[41] << 16 | (ulong)ntpData[42] << 8 | (ulong)ntpData[43];
ulong fractPart = (ulong)ntpData[44] << 24 | (ulong)ntpData[45] << 16 | (ulong)ntpData[46] << 8 | (ulong)ntpData[47];
var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
var networkDateTime = (new DateTime(1900, 1, 1)).AddMilliseconds((long)milliseconds);
return networkDateTime;
}
var networkTime = GetNetworkTime();
Console.WriteLine($"{DateTime.UtcNow} {networkTime}");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment