2015-08-22 4 views
0

Im пытается читать нтп через StreamReader и я затрудняюсь при выборке время от ph.pool.ntp.org, и это дает мне outofboundsexception, когда я пытаюсь запустить его на таймерNTP чтения VB.NET

Heres мой код

Public Function GetNISTTime(ByVal host As String) As DateTime 

    Dim timeStr As String = "" 

    Try 
     Dim reader As New StreamReader(New TcpClient(host, 13).GetStream) 
     timeStr = reader.ReadToEnd() 
     Console.WriteLine(timeStr.ToString) 
     reader.Close() 
    Catch ex As SocketException 
     Label1.Text = ex.Message 
    Catch ex As Exception 
     Label1.Text = ex.Message 
    End Try 

    Dim jd As Integer = Integer.Parse(timeStr.Substring(1, 5)) 
    Dim yr As Integer = Integer.Parse(timeStr.Substring(7, 2)) 
    Dim mo As Integer = Integer.Parse(timeStr.Substring(10, 2)) 
    Dim dy As Integer = Integer.Parse(timeStr.Substring(13, 2)) 
    Dim hr As Integer = Integer.Parse(timeStr.Substring(16, 2)) 
    Dim mm As Integer = Integer.Parse(timeStr.Substring(19, 2)) 
    Dim sc As Integer = Integer.Parse(timeStr.Substring(22, 2)) 
    Dim Temp As Integer = CInt(AscW(timeStr(7))) 

    Return New DateTime(yr + 2000, mo, dy, hr, mm, sc) 

End Function 

и имя хоста загружаются в таймере

Label1.Text = GetNISTTime("ph.pool.ntp.org ").ToString 

и это начать с timer.start() в виде нагрузки.

+0

Покажите нам, что строка возвращается в. – OneFineDay

+0

@onefineday не возвращает строку, потому что она запускает исключение: 'System.ArgumentOutOfRangeException –

+0

WHERE? Какая линия? – OneFineDay

ответ

0
Public Function GetNISTTime(ByVal host As String) As DateTime 
    Using sck = New TcpClient(host, 13) 
     System.Threading.Thread.Sleep(100) 'give the server time to answer 
     Using strm = sck.GetStream 
      strm.ReadTimeout = 1000 '1s timeout 
      Dim buf(1023) As Byte 
      Dim read As Integer = 0 
      While read < 50 'loop until enough data is read 
       read += strm.Read(buf, read, 1024) 
       If read = 0 Then 'connection lost 
        Return Nothing 'or throw exception 
       End If 
      End While 
      Dim rawstring As String = System.Text.Encoding.ASCII.GetString(buf).Trim() 
      Dim rawdata As String() = rawstring.Split(" ") 
      Dim strdate As String() = rawdata(1).Split("-") 
      Dim strtime As String() = rawdata(2).Split(":") 
      Return New DateTime(2000 + strdate(0), strdate(1), strdate(2), strtime(0), strtime(1), strtime(2)) 
     End Using 
    End Using 
End Function 

Вместо использования Substring, я использовал другой подход: Split.

Также я изменил способ чтения данных с сервера, так как вы не дали серверу достаточно времени для предоставления ответа.

Обратите внимание, что иногда сервер удаляет соединение вместо отправки вам времени, поэтому проверьте, возвращает ли функция Nothing.

Наконец, вам лучше использовать библиотеку NTP или, по крайней мере, отправить серверу ожидаемый ввод.

Интересный связанный с этим вопрос: How to Query an NTP Server using C#?

Смежные вопросы