Maison >développement back-end >C++ >Comment obtenir le temps du réseau actuel à partir d'un serveur NTP à l'aide de C #?

Comment obtenir le temps du réseau actuel à partir d'un serveur NTP à l'aide de C #?

DDD
DDDoriginal
2025-01-29 00:26:12846parcourir

How to Get the Current Network Time from an NTP Server using C#?

Récupération du temps du réseau à partir d'un serveur NTP avec C #

Ce guide montre une méthode simple pour obtenir l'heure actuelle à partir d'un serveur NTP (Network Time Protocol) en utilisant C #.

Voici le code C #:

<code class="language-csharp">using System;
using System.Net;
using System.Net.Sockets;

public static class NetworkTime
{
    public static DateTime GetNetworkTime()
    {
        const string ntpServer = "time.windows.com"; // Or another NTP server
        const int ntpDataSize = 48;
        const int serverReplyTimeOffset = 40;

        byte[] ntpData = new byte[ntpDataSize];
        IPAddress[] addresses = Dns.GetHostEntry(ntpServer).AddressList;

        using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
        {
            IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], 123);
            socket.Connect(ipEndPoint);
            socket.ReceiveTimeout = 3000; // 3-second timeout
            socket.Send(ntpData);
            socket.Receive(ntpData);
        }

        ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTimeOffset);
        ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTimeOffset + 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();
    }

    static uint SwapEndianness(ulong x)
    {
        return (uint)(((x & 0x000000ff) << 24) +
                       ((x & 0x0000ff00) << 8) +
                       ((x & 0x00ff0000) >> 8) +
                       ((x & 0xff000000) >> 24));
    }
}</code>

N'oubliez pas d'ajouter using System.Net; et using System.Net.Sockets; à votre projet. Cette version améliorée utilise des noms de variables plus descriptifs et clarifie le type de retour de la fonction SwapEndianness pour une meilleure lisibilité et maintenabilité. Un délai d'expiration est également ajouté à l'opération de réception de la prise pour éviter le blocage indéfini.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn