3
Windows 응용 프로그램에서 w32tm을 사용하여 컴퓨터가 특정 시간 리소스와 동기화되도록합니다. 하지만 이제는 WM5.0에서 PDA 응용 프로그램을 만들고 있습니다. w32tm은 더 이상 사용할 수 없으며 Google에서 약간 검색 한 후 시작하는 방법을 모릅니다.WM의 인터넷 리소스와 시간을 어떻게 동기화 할 수 있습니까?
Windows 응용 프로그램에서 w32tm을 사용하여 컴퓨터가 특정 시간 리소스와 동기화되도록합니다. 하지만 이제는 WM5.0에서 PDA 응용 프로그램을 만들고 있습니다. w32tm은 더 이상 사용할 수 없으며 Google에서 약간 검색 한 후 시작하는 방법을 모릅니다.WM의 인터넷 리소스와 시간을 어떻게 동기화 할 수 있습니까?
public DateTime GetNTPTime()
{
// 0x1B == 0b11011 == NTP version 3, client - see RFC 2030
byte[] ntpPacket = new byte[] { 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
IPAddress[] addressList = Dns.GetHostEntry("pool.ntp.org").AddressList;
if (addressList.Length == 0)
{
// error
return DateTime.MinValue;
}
IPEndPoint ep = new IPEndPoint(addressList[0], 123);
UdpClient client = new UdpClient();
client.Connect(ep);
client.Send(ntpPacket, ntpPacket.Length);
byte[] data = client.Receive(ref ep);
// receive date data is at offset 32
// Data is 64 bits - first 32 is seconds - we'll toss the fraction of a second
// it is not in an endian order, so we must rearrange
byte[] endianSeconds = new byte[4];
endianSeconds[0] = data[32 + 3];
endianSeconds[1] = data[32 + 2];
endianSeconds[2] = data[32 + 1];
endianSeconds[3] = data[32 + 0];
uint seconds = BitConverter.ToUInt32(endianSeconds, 0);
return (new DateTime(1900, 1, 1)).AddSeconds(seconds);
}
아주 좋은 편집 : 완성도를 들어
, 여기에 블로그 기사에서 코드의 D – geogeek