如何使用C#查询NTP服务器?

我需要的是一种使用C#查询NTP服务器的方法,以获取NTP服务器的日期时间,以a string或as形式返回DateTime

最简单的形式怎么可能?

回答:

由于旧的答案被删除了(它是指向不再存在的Google代码搜索结果的链接),我认为我可以回答这个问题以供将来参考:

public static DateTime GetNetworkTime()

{

//default Windows time server

const string ntpServer = "time.windows.com";

// NTP message size - 16 bytes of the digest (RFC 2030)

var ntpData = new byte[48];

//Setting the Leap Indicator, Version Number and Mode values

ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

var addresses = Dns.GetHostEntry(ntpServer).AddressList;

//The UDP port number assigned to NTP is 123

var ipEndPoint = new IPEndPoint(addresses[0], 123);

//NTP uses UDP

using(var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))

{

socket.Connect(ipEndPoint);

//Stops code hang if NTP is blocked

socket.ReceiveTimeout = 3000;

socket.Send(ntpData);

socket.Receive(ntpData);

socket.Close();

}

//Offset to get to the "Transmit Timestamp" field (time at which the reply

//departed the server for the client, in 64-bit timestamp format."

const byte serverReplyTime = 40;

//Get the seconds part

ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

//Get the seconds fraction

ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

//Convert From big-endian to little-endian

intPart = SwapEndianness(intPart);

fractPart = SwapEndianness(fractPart);

var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

//**UTC** time

var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);

return networkDateTime.ToLocalTime();

}

// stackoverflow.com/a/3294698/162671

static uint SwapEndianness(ulong x)

{

return (uint) (((x & 0x000000ff) << 24) +

((x & 0x0000ff00) << 8) +

((x & 0x00ff0000) >> 8) +

((x & 0xff000000) >> 24));

}

您将必须添加以下名称空间

using System.Net;

using System.Net.Sockets;

以上是 如何使用C#查询NTP服务器? 的全部内容, 来源链接: utcz.com/qa/403447.html

回到顶部