Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk mendapatkan masa rangkaian semasa dari pelayan NTP menggunakan C#?

Bagaimana untuk mendapatkan masa rangkaian semasa dari pelayan NTP menggunakan C#?

DDD
Lepaskan: 2025-01-29 00:26:12
asal
879 orang telah melayarinya

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

Mendapatkan masa rangkaian dari pelayan NTP dengan C#

Panduan ini menunjukkan kaedah mudah untuk mendapatkan masa semasa dari pelayan NTP (Rangkaian Masa Protokol) menggunakan C#.

inilah kod c#:

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));
    }
}
Salin selepas log masuk
ingat untuk menambah

dan using System.Net; ke projek anda. Versi yang lebih baik ini menggunakan lebih banyak nama pemboleh ubah deskriptif dan menjelaskan jenis pulangan fungsi using System.Net.Sockets; untuk kebolehbacaan dan kebolehkerjaan yang lebih baik. Masa tamat juga ditambah ke soket menerima operasi untuk mengelakkan penyekatan tidak terbatas. SwapEndianness

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan masa rangkaian semasa dari pelayan NTP menggunakan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan