Abstractions.Windows.Networking.GetNetworkTime C# (CSharp) Метод

GetNetworkTime() публичный статический Метод

get UTC ntp time based on http://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c
public static GetNetworkTime ( string FQDN ) : System.DateTime
FQDN string server address
Результат System.DateTime
        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;
        }