Aloha hiero,
ik ben momenteel bezig met het schrijven van een DLL die communicatie met een NTP server mogelijk maakt. Ik ben eerst op internet gaan zoeken hoe de communicatie met een NTP server gaat in .Net, hierbij ben ik tegen de volgende site aangelopen, namelijk die van Peter Slade. Nu heb ik zijn complete code geport naar VB.Net, en ben hierop gaan verder borduren, in de hoop dat ik alle functionaliteit erin kon krijgen. Inmiddels zit mijns inziens de functionaliteit erin, en wil ik de DLL gaan testen middels een simpel formpje. Echter nu loopt het al meteen bij de eerste test spaak. Zodra .Net bij udpSocket.Receive aankomt blijft .Net gewoon stilstaan.... en dat terwijl ik daar toch eigenlijk een tijd zou moeten krijgen. De code die ik gemaakt heb is de volgende: Let niet op het commentaar.
Echter bij het aanroepen van de functie MsgBox(ClassLib.NetworkTimeClient.Time.ToString) bij een ButtonClick blijft het programma hangen bij de regel ntpData = udpSocket.Receive(eindPunt) in de Get functie van de property Time. Maar ik zie niet in wat ik nou precies fout doe hier
Wie kan me op weg helpen en zeggen wat er fout is aan die regel, of wat ik moet proberen? Mijn dank is groot.
ik ben momenteel bezig met het schrijven van een DLL die communicatie met een NTP server mogelijk maakt. Ik ben eerst op internet gaan zoeken hoe de communicatie met een NTP server gaat in .Net, hierbij ben ik tegen de volgende site aangelopen, namelijk die van Peter Slade. Nu heb ik zijn complete code geport naar VB.Net, en ben hierop gaan verder borduren, in de hoop dat ik alle functionaliteit erin kon krijgen. Inmiddels zit mijns inziens de functionaliteit erin, en wil ik de DLL gaan testen middels een simpel formpje. Echter nu loopt het al meteen bij de eerste test spaak. Zodra .Net bij udpSocket.Receive aankomt blijft .Net gewoon stilstaan.... en dat terwijl ik daar toch eigenlijk een tijd zou moeten krijgen. De code die ik gemaakt heb is de volgende: Let niet op het commentaar.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| Imports System
Imports System.Net
Imports System.Net.Sockets
Public Class NetworkTimeClient
Declare Function SetSystemTime Lib "kernel32" Alias "SetSystemTime" (ByVal lpSystemTime As SYSTEMTIME) As Long
Private ntpData(48) As Byte ' Structure - RFC 2030
Private offsetTransmitTime As Byte = 40 ' Timestamp locatie in NTP Structure
Private Server As String = "time.windows.com" ' Standaard server address
Private Poort As Integer = 123 ' Standaard port
Private receiveTime As DateTime ' Tijd die ontvangen is van de server
Public Sub New()
End Sub 'New
Public ReadOnly Property Time() As DateTime
Get
Dim udpSocket As UdpClient = Nothing
Try
Dim adres As IPHostEntry = Dns.GetHostEntry(Me.Server)
Dim eindPunt As New IPEndPoint(adres.AddressList(0), Me.Poort)
udpSocket = New UdpClient()
udpSocket.Connect(eindPunt)
ntpData(0) = &H1B ' Zet versie tot 4, client mode
Dim i As Integer
For i = 1 To 47 ' Zet overal een 0
ntpData(i) = 0
Next
udpSocket.Send(ntpData, ntpData.Length)
ntpData = udpSocket.Receive(eindPunt)
receiveTime = Date.Now
' Bereken het tijdsverschil en offset voor de NTP tijd
Dim intpart As ULong = 0
Dim fractpart As ULong = 0
For i = 0 To 3
intpart = 256 * intpart + ntpData((offsetTransmitTime + i))
Next
For i = 4 To 7
fractpart = 256 * fractpart + ntpData((offsetTransmitTime + i))
Next
Dim milliseconds As ULong = (intpart * 1000 + fractpart * 1000 / 4294967296)
Dim timeSpan As TimeSpan = System.TimeSpan.FromMilliseconds(CDbl(milliseconds))
Dim dateTime As New DateTime(1900, 1, 1)
dateTime += timeSpan
Dim offsetAmount As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(dateTime)
Dim networkDateTime As DateTime = dateTime + offsetAmount
Return networkDateTime
Catch ex As SocketException
Throw New Exception(ex.Message)
Finally
If Not (udpSocket Is Nothing) Then
Try
udpSocket.Close()
Catch
End Try
End If
End Try
End Get
End Property
Public Overloads Shared Function GetNetworkTime() As DateTime
Dim ntc As New NetworkTimeClient()
Return ntc.Time
End Function 'GetNetworkTime
End Class 'NetworkTimeClient |
Echter bij het aanroepen van de functie MsgBox(ClassLib.NetworkTimeClient.Time.ToString) bij een ButtonClick blijft het programma hangen bij de regel ntpData = udpSocket.Receive(eindPunt) in de Get functie van de property Time. Maar ik zie niet in wat ik nou precies fout doe hier
[ Voor 72% gewijzigd door F-Tim op 28-03-2006 13:50 . Reden: Code inkorten op adminverzoek ]
Wanna play?