Heim >Backend-Entwicklung >C++ >Wie rufe ich mit C#eine genaue Zeit von einem NTP -Server ab?

Wie rufe ich mit C#eine genaue Zeit von einem NTP -Server ab?

Barbara Streisand
Barbara StreisandOriginal
2025-01-29 00:36:09751Durchsuche

How to Retrieve Accurate Time from an NTP Server Using C#?

Genauige Zeit von einem NTP -Server mit C#

abrufen

Dieser C# -Codes -Snippet zeigt, wie Sie die aktuelle Zeit von einem Network Time Protocol (NTP) -Server abrufen:

<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>

Denken Sie daran, diese mit Anweisungen hinzuzufügen:

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

Dieser überarbeitete Code bietet eine verbesserte Klarheit und verwendet effizientere Byte -Auftragsaustausch. Die SwapEndianness -Funktion wird auch für das ordnungsgemäße Ulong -Handling korrigiert.

Das obige ist der detaillierte Inhalt vonWie rufe ich mit C#eine genaue Zeit von einem NTP -Server ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn