Use C#to query NTP server: complete solution
This method depends on the network time protocol (NTP), which involves sending query messages to the NTP server. The server will reply to the reply message containing the current time. Then, we extract time from the reply and convert it to the available format.
<code class="language-csharp">using System; using System.Net; using System.Net.Sockets; public static class NTP { public static DateTime GetNetworkTime() { const string ntpServer = "time.windows.com"; const int ntpPort = 123; byte[] ntpData = new byte[48]; ntpData[0] = 0x1B; // LI = 0, VN = 3, Mode = 3 (Client) using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { socket.Connect(new IPEndPoint(Dns.GetHostEntry(ntpServer).AddressList[0], ntpPort)); socket.Send(ntpData); socket.Receive(ntpData); } const int serverReplyTime = 40; ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); intPart = SwapEndianness(intPart); fractPart = SwapEndianness(fractPart); long milliseconds = (long)(intPart * 1000) + (long)((fractPart * 1000) / 0x100000000L); DateTime networkDateTime = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds); return networkDateTime.ToLocalTime(); } private static ulong SwapEndianness(ulong x) { return (ulong)( ((x & 0x000000ff) << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | ((x & 0xff000000) >> 24) ); } }</code>
The above is the detailed content of How to Query an NTP Server for Current Date and Time Using C#?. For more information, please follow other related articles on the PHP Chinese website!