[VB.Net] udpSocket.Receive hangt applicatie

Pagina: 1
Acties:

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 23-02 12:35
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.

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 :'( Wie kan me op weg helpen en zeggen wat er fout is aan die regel, of wat ik moet proberen? Mijn dank is groot.

[ Voor 72% gewijzigd door F-Tim op 28-03-2006 13:50 . Reden: Code inkorten op adminverzoek ]

Wanna play?


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:56
Dat is omdat Receive een blocking call is. Je hebt ook asynchrone BeginReceive en EndReceive call.
Misschien moet je daar eens naar kijken.

Het is trouwens niet nodig om hier +200 lijnen irrelevante code te dumpen. Dus, edit eens je post en post eens enkel de relevante code aub.

[ Voor 14% gewijzigd door whoami op 28-03-2006 13:36 ]

https://fgheysels.github.io/


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 23-02 12:35
Bij deze is de code ingekort tot slechts wat relevante stukken. En dan zal ik eens gaan rondspeuren hoe het zit met BeginReceive en EndReceive, eens kijken wat ik daarmee kan dan....

Wanna play?