using System;
using System.Net;
using System.Net.Sockets;
public
static
class
NTP
{
public
static
DateTime GetNetworkTime()
{
const
string ntpServer =
"time.windows.com"
;
const
int ntpPort = 123;
byte[] ntpData =
new
byte[48];
ntpData[0] = 0x1B;
using (
var
socket =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
socket.Connect(
new
IPEndPoint(Dns.GetHostEntry(ntpServer).AddressList[0], ntpPort));
socket.Send(ntpData);
socket.Receive(ntpData);
}
const
int serverReplyTime = 40;
ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 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();
}
private
static
ulong SwapEndianness(ulong x)
{
return
(ulong)(
((x & 0x000000ff) << 24) |
((x & 0x0000ff00) << 8) |
((x & 0x00ff0000) >> 8) |
((x & 0xff000000) >> 24)
);
}
}