TCP Verbindung vernünftig schließen und wieder aufbauen "reconnecten"

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    TCP Verbindung vernünftig schließen und wieder aufbauen "reconnecten"

    Moin,

    ich versuche mich seit gestern an TCP in VB.Net und versuche den Client zu "reconnecten".
    Doch ich bekomme immer den Fehler "Auf das verworfene Objekt kann nicht zugegriffen werden".
    Da ich den Client und den Stream mit .Close beendet habe.

    Nun die eigentliche Frage, gibt es eine elegante Lösung? vllt. so etwas wie client.reconnect :) ?


    LG Tomo
    Das ist alles n bisken wenig Info. Bisheriger Code wäre sinnvoll, da nicht klar ist, wie Du womit Deine Verbindung erzeugst.

    VB.NET-Quellcode

    1. Do
    2. If Not TCPClient.Connected Then
    3. TCPClient = TCPListener.AcceptTcpClient
    4. Else
    5. TCPClient.Close()
    6. Continue Do
    7. End If
    8. 'do whatever you want
    9. Loop

    funktioniert bei mir, allerdings unter folgenden Voraussetzungen:
    • TCPClient ist vom Typ Net.Sockets.TCPClient
    • TCPListener ist vom Typ Net.Sockets.TCPListener
    • TCPListener hat nen gültigen LocalEndPoint (erzeugt?)
    Ehm ... der Stream sollte m.E. aber erst geschlossen werden, wenn das Programm zuende ist, da die Streams ja für die Verbindungen zu allen möglichen Clients genutzt wird. Probier mal das.
    Und warum reconnect? Der Server sollte "offen für alles" sein, im Sinne von: jeglichen gültigen Client akzeptieren. Eine Verbindung zu einem bestimmten Client zu schließen, um die gleiche Verbindung (nicht die selbe, ist ein Unterschied!) aufzubauen, wäre ... , nun ja, da wäre es interessant zu wissen, in welchen Situationen man sowas braucht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    1. Bitte keine Vollzitate, wenn der Beitrag direkt über dem eigenen Post steht. Da gibt's n Rüffel von den Moderatoren.
    2. Es fehlt immer noch Code Deinerseits.
    3. LocalEndPoint ist bei meiner Art der TCP-Verbindung nötig:

    VB.NET-Quellcode

    1. IPEndPoint = New Net.IPEndPoint(Net.IPAddress.Any, DeinPortÜberDenDieVerbindungStattfindenSoll) 'z.B. ne bestimmte Zahl, wie 8000
    2. TCPListener = New Net.Sockets.TcpListener(IPEndPoint)

    Kommt mit zur TCP-Thread-Initialisierung - bei mir.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Dim client As New Net.Sockets.TcpClient
    2. Try
    3. client.Connect("127.0.0.1", 1)
    4. client.GetStream()
    5. Catch ex As Exception
    6. MsgBox(ex.ToString)
    7. client.Client.Close()
    8. client.Close()
    9. End Try


    Das ist bis her mein Versuch gewesen. Fehler : "Auf das verworfene Objekt konnte nicht zugegriffen werden"

    Nebenbei ist mir aufgefallen das ich mich nicht richtig ausgedrückt habe ;) Ich will den Client zum Server reconnecten, sprich beim Client z.B. auf ein btn drücken und dieser Löst die Verbindung auf und beim erneuten drücken wird diese wieder aufgenommen :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tomo“ ()

    Leider immer noch zuwenig Infos. Tritt das Problem immer auf oder wenn Du den Reconnect versuchst? Streich das MsgBox(ex.ToString), sondern verarbeite die Exceptions korrekt. In welcher Zeile tritt das Problem auf? Ich vermute in 4, aber solche Infos muss der TE (in dem Fall Du) von sich aus geben.
    Client.Client.Close() und Client.Close()? Sicher?
    Außerdem am besten nach Client.Close() noch Client = Nothing schreiben und vor jedem neuen client.Connect("127.0.0.1", 1) ein client = New Net.Sockets.TcpClient setzen. Dein alter Client ist nach dem Client.Close() nicht mehr zu gebrauchen. Ein Reconnect ist mit diesem Objekt m.E. nicht mehr möglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.