SORU
28 Temmuz 2009, Salı


Bir NTP Sunucusu C kullanarak Sorgu nasıl giderilir?

Tek ihtiyacım bir NTP Sunucusu C kullanarak sorgulamak için bir yoldur# NTP Sunucusu Zaman da string DateTime olarak döndü. Randevu almak için

Nasıl en basit şekliyle bu mümkün mü?

CEVAP
27 AĞUSTOS 2012, PAZARTESİ


Eski kabul cevabı (artık var olmayan Google kod arama sonuçlarına bir bağlantı olduğunu) silinmiş olduğundan beri, ileride bu soruya cevap verebilirim diye düşündüm :

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
    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));
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Barnacules Nerdgasm

    Barnacules N

    20 Temmuz 2006
  • Djbasilio AuToBaSs

    Djbasilio Au

    20 Aralık 2008
  • Jason Parker

    Jason Parker

    14 Aralık 2009