ホームページ >バックエンド開発 >C++ >C#を使用してNTPサーバーから正確な時間を取得する方法は?

C#を使用してNTPサーバーから正確な時間を取得する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-29 00:36:09751ブラウズ

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

c#

を使用してNTPサーバーから正確な時間を取得します

このC#コードスニペットは、ネットワークタイムプロトコル(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>

ステートメントを使用してこれらを追加することを忘れないでください:

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

この改訂されたコードは、明確さの向上を提供し、より効率的なバイトオーダースワッピングを利用します。 SwapEndianness関数は、適切なハンドリングのために修正されます。

以上がC#を使用してNTPサーバーから正確な時間を取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。