Socket Communication

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Socket Communication

    Hallo zusammen.

    Ich muss mit einem Gerät via Ethernet Kommunizieren und dabei ist es wichtig, das Gerät zu aktivieren und dann zu messen wie lange dieses zum Booten benötigt. Also die Zeit vom bestromen bis eine Socket Verbindung aufgebaut werden kann.

    Hier mein Lösungsansatz:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.ComponentModel
    4. Imports System.Text
    5. Public Class Form1
    6. Dim i As Integer = 0
    7. Dim success
    8. Dim result
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. Connect()
    11. End Sub
    12. Public Sub Connect()
    13. StartConnection:
    14. Try
    15. Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    16. result = s.BeginConnect("10.0.0.1", 1300, New AsyncCallback(AddressOf s.EndConnect), s)
    17. success = result.AsyncWaitHandle.WaitOne(1000, True)
    18. If success = True Then
    19. Label1.Text = "Connected"
    20. Timer1.Stop()
    21. Timer1.Dispose()
    22. Else
    23. success = Nothing
    24. GoTo StartConnection
    25. End If
    26. Catch ex As Exception
    27. Messagebox.show(ex.Message)
    28. End Try
    29. End Sub
    30. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    31. i += 1
    32. Label1.Text = i
    33. End Sub
    34. End Class



    Wenn das Gerät bereits läuft und ich starte dann das Programm, dann funktioniert das ganze wie gewollt, wenn jedoch die Bootzeit abgewartet wird, erscheint immer folgende Fehlermeldung (siehe Anhang)


    BG

    *Topic verschoben*
    Bilder
    • err_vb.png

      14,01 kB, 1.221×723, 63 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @dr. Nick Beginne mit Option Strict On :!:
    Visual Studio - Empfohlene Einstellungen
    ====
    Zum Testen hätte ich gern die Gegenstelle, so kann ich nur ein wenig stochern.
    Klassen-Variablen des Namens i sind ein NoGo, i ist gut für eine Laufvariable in einer For-Schleife.
    Dann wird das ganze per Button-Click gestartet, da kannst Du mehrere Tests mit einer Programm-Instanz durchführen.
    Wenn Dir die Genauigkeit von einere Sekunde reicht, pack den Connection-Code in den Timer und programmier das ordentlich, ohne Endlosschleife.
    Form mit Button, Timer und zwei Labels:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Public Class Form1
    3. Dim Elapsed As Stopwatch
    4. Dim Counter As Integer = 0
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Label2.Text = String.Empty
    7. Elapsed = Stopwatch.StartNew()
    8. Timer1.Start()
    9. End Sub
    10. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    11. TestConnection()
    12. End Sub
    13. Public Sub TestConnection()
    14. Try
    15. Dim success As Boolean
    16. Using s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    17. Dim result As IAsyncResult = s.BeginConnect("10.0.0.1", 1300, New AsyncCallback(AddressOf s.EndConnect), s)
    18. success = result.AsyncWaitHandle.WaitOne(1000, True)
    19. End Using
    20. If success Then
    21. Timer1.Stop()
    22. Label1.Text = "Connected"
    23. Label2.Text = Elapsed.ElapsedMilliseconds.ToString
    24. Else
    25. Counter += 1
    26. Label1.Text = Counter.ToString()
    27. End If
    28. Catch ex As Exception
    29. Label2.Text = ex.Message
    30. End Try
    31. End Sub
    32. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok danke für die schnelle Antwort.

    Zur Gegenstelle darf ich leider nichts sagen, da es ein Kundenprojekt ist. Es ist so, dass die Gegenstelle nicht direkt etwas zurückgibt wenn sie hochgefahren ist, sondern erst wenn sie einen Befehl erhält. Genauigkeit von einer Sekunde reicht.

    Noch eine Frage, was mache ich damit:

    VB.NET-Quellcode

    1. ​New AsyncCallback(AddressOf s.EndConnect)


    und was besagt eigentlich genau die Fehlermeldung?


    BG

    dr. Nick schrieb:

    und was besagt eigentlich genau die Fehlermeldung?
    Fas ist nach meinem Ermessen keine Fehlermeldung.
    Bei welchem Sachverhalt wird diese Meldung angezeigt?
    Hast Du ein Break gemacht, weil nix passiert ist?
    Probierma: "Ausführung fortsetzen".
    Ich nehme mal an, dass das so was wie ein unterbrochenes Warten auf Timeout ist, wie gesagt, ohne Hardware keine genaue Aussage.
    ====
    Vielleicht kannst Du dem Socket ein Timeout mitgeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    dr. Nick schrieb:

    Also die Zeit vom bestromen bis eine Socket Verbindung aufgebaut werden kann.


    Für mein Verständnis ist das nicht zu machen. Der Socket verbindet doch erst, wenn an der Gegenstelle der Socket in den Listen-Modus versetzt wird. Sprich, das entsprechende Programm muss gestartet sein, ergo muss der PC oder was auch immer schon hochgefahren sein. Der Zeitpunkt, an dem Strom ans Gerät angelegt wurde, lässt sich nicht genau bestimmen und somit lässt sich auch die Bootzeit nicht genau bestimmen.

    Du kannst z. B. alle 10 Sekunden einen Verbindungsversuch starten, um rauszufinden, ob das Gerät schon eingeschalten ist. Oder was in meinen Augen besser wäre ist, dass Gerät meldet sich, wenn es es bereit ist.

    Wie gesagt, da es keinen exakten Zeitpunkt für das Stromanlegen gibt, gibt es auch keine genaue Zeitspanne zwischen Strom anlegen und System bereit.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o