3

我正在尝试使用以下代码连接到时间服务器并获得时间但没有运气:

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()

跟踪程序我无法通过以下代码行 soc.Receive(ntpData)。我究竟做错了什么?

谢谢

4

1 回答 1

1

您需要向服务器提供一些基本信息:

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以获取更多详细信息。

于 2013-10-30T16:13:54.737 回答