Récupération du temps précis à partir d'un serveur NTP avec C #
cet extrait de code C # montre comment récupérer l'heure actuelle à partir d'un serveur de protocole de temps réseau (NTP):
<code class="language-csharp">public static DateTime GetNetworkTime() { // Default NTP server address string ntpServer = "time.windows.com"; // NTP packet size byte[] ntpData = new byte[48]; // Configure NTP packet ntpData[0] = 0x1B; // Leap indicator, version, and client mode // Resolve NTP server IP address IPAddress[] addresses = Dns.GetHostAddresses(ntpServer); // Create endpoint for NTP server (port 123) IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], 123); using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { socket.Connect(ipEndPoint); // Set receive timeout socket.ReceiveTimeout = 3000; socket.Send(ntpData); socket.Receive(ntpData); socket.Close(); } // Offset for server reply time in the NTP packet const int serverReplyTimeOffset = 40; // Extract timestamp components ulong integerPart = BitConverter.ToUInt32(ntpData, serverReplyTimeOffset); ulong fractionalPart = BitConverter.ToUInt32(ntpData, serverReplyTimeOffset + 4); // Convert to little-endian byte order integerPart = SwapEndianness(integerPart); fractionalPart = SwapEndianness(fractionalPart); // Calculate milliseconds long milliseconds = (long)(integerPart * 1000) + (long)((fractionalPart * 1000) / 0x100000000L); // Construct DateTime object from NTP timestamp (UTC) DateTime networkDateTime = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds); // Convert to local time return networkDateTime.ToLocalTime(); } // Helper function for byte order conversion static ulong SwapEndianness(ulong x) { return (ulong)(((x & 0x000000ff) << 24) + ((x & 0x0000ff00) << 8) + ((x & 0x00ff0000) >> 8) + ((x & 0xff000000) >> 24)); }</code>
N'oubliez pas d'ajouter ces instructions en utilisant:
<code class="language-csharp">using System.Net; using System.Net.Sockets;</code>
Ce code révisé offre une clarté améliorée et utilise un échange d'ordre d'octet plus efficace. La fonction SwapEndianness
est également corrigée pour une manipulation ulongée appropriée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!