2013-10-30 78 views
2

我嘗試使用下面的代碼連接到時間服務器,達到時間,但有沒有運氣:難度連接到NTP時間服務器

Dim ntpServer As String = "time.windows.com" 
Dim ntpData(47) As Byte 
Dim addresses = Dns.GetHostEntry(ntpServer).AddressList 
Dim EndP As IPEndPoint = New IPEndPoint(addresses(0), 123) 

Dim soc As Socket = New Socket(AddressFamily.InterNetwork, _ 
     SocketType.Dgram, ProtocolType.Udp) 

soc.Connect(EndP) 
soc.Send(ntpData) 
soc.Receive(ntpData) 

soc.Close() 

通過該計劃,我可以」追蹤t通過以下代碼soc.Receive(ntpData)。我究竟做錯了什麼?

感謝

+1

這是我的經驗,時間服務器不能總是連接。你最好使用服務器列表(谷歌),並ping每一個,直到你找到一個活躍的。 – tinstaafl

+0

「不好運氣」是什麼意思?有錯誤嗎? – Steve

+0

似乎沒有什麼事情發生 - 但我永遠無法到達soc.Close() – thehoten

回答

0

你需要提供一些基本的信息到服務器:

ntpData(0) = 27

ntpData(0)包含一個名爲firstByteBits部分。

在發送數據以查詢答覆之前,需要設置此部分。

第一字節是

0 1 2 3 4 5 6 7 
+-+-+-+-+-+-+-+-+ 
|LI | VN |Mode | 
  • LI =(在發送數據0)飛躍指示器
  • VN =版本號(3,位3和4組)
  • 模式=模式(客戶端模式= 3,位6和7組)

00011011 = 27 = 0x1B

可能還有更好的NTP服務器。 time.windows.com:123服務器池已知爲 速度較慢,有時不響應一段時間,準確度較低。更好:pool.ntp.org:123(但請閱讀關於正常使用的poo.ntp.org上的內容)。

例如RFC 5905瞭解更多詳情。