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
Freigeben: 2025-01-29 00:36:09
Original
747 Leute haben es durchsucht

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>
Nach dem Login kopieren

Denken Sie daran, diese mit Anweisungen hinzuzufügen:

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

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage