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 セット)
  • Mode = Mode (クライアント モード = 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 に答える