public static DateTime GetNetworkTime(string[] FQDN)
{
DateTime RetVal = DateTime.MinValue;
//time server
for (uint x = 0; x < FQDN.Length; x++)
{
// NTP message size - 16 bytes of the digest (RFC 2030)
Byte[] 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)
try
{
IPAddress[] addresses = Dns.GetHostEntry(FQDN[x]).AddressList;
//The UDP port number assigned to NTP is 123
IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], 123);
//NTP uses UDP
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.ReceiveTimeout = 3 * 1000;
socket.SendTimeout = 3 * 1000;
socket.Connect(ipEndPoint);
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
UInt64 intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
//Get the seconds fraction
UInt64 fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);
//Convert From big-endian to little-endian
intPart = SwapEndianness(intPart);
fractPart = SwapEndianness(fractPart);
UInt64 milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
//**UTC** time
RetVal = (new DateTime(1900, 1, 1)).AddMilliseconds((Int64)milliseconds);
break;
}
catch (Exception ex)
{
LibraryLogging.Error("get ntp {0} error:{1}", FQDN[x], ex);
}
}
return RetVal;
}