tcp socket connect/close

  • VB.NET
  • .NET 3.5

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

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

    tcp socket connect/close

    wahrscheinlich schon tausendmal besprochen : aber ich finde es nicht ;(

    warum geht das nicht :
    Public Class Form1

    Dim bytefeld() As Byte = {1, 0, 20, 1}
    Dim IP As New IPAddress(bytefeld)
    Dim tcpClient As New TcpClient

    'Verbindung öffnen
    Public Sub Button1_Click() Handles Button1.Click
    tcpClient.Connect(IP, 33000)
    TextBox1.Text = "connect"
    End Sub

    'Verbindung schließen
    Public Sub Button2_Click() Handles Button2.Click
    tcpClient.Close()
    TextBox1.Text = "disconnect"
    End Sub

    End Class

    beim zweiten verbindungsversuch kommt : "auf das verworfene objekt kann nicht zugegriffen werden"
    Weil, wie man hier nachlesen kann,
    msdn.microsoft.com/de-de/libra…ient.close(v=vs.110).aspx
    Close() die Instanz auch disposed. Du musst sie also neu Initialisieren, bevor du Connect() aufrufst
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    so :
    Dim bytefeld() As Byte = {1, 0, 20, 1}
    Dim IP As New IPAddress(bytefeld)
    Dim tcpClient As New TcpClient

    'Verbindung öffnen
    Public Sub Button1_Click() Handles Button1.Click
    Dim tcpClient As New TcpClient
    tcpClient.Connect(IP, 33000)
    TextBox1.Text = "connect"
    End Sub

    ..geht das aber nicht, das ist wohl klar, aber wie dann ?
    @klassenfeind So:

    VB.NET-Quellcode

    1. Dim bytefeld() As Byte = {1, 0, 20, 1}
    2. Dim IP As New IPAddress(bytefeld)
    3. Dim tcpClient As TcpClient = Nothing
    4. 'Verbindung öffnen
    5. Public Sub Button1_Click() Handles Button1.Click
    6. tcpClient = New IPAddress(bytefeld)
    7. tcpClient.Connect(IP, 33000)
    8. TextBox1.Text = "connect"
    9. End Sub
    10. 'Verbindung schließen
    11. Public Sub Button2_Click() Handles Button2.Click
    12. If tcpClient IsNot Nothing Then
    13. tcpClient.Close()
    14. End If
    15. TextBox1.Text = "disconnect"
    16. End Sub
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Nothing bedeutet grob, dass die Variable tcpClient kein Objekt hat bzw. auf kein Objekt zeigt.
    Um tcpClient zu verwenden musst du diese Variable später erst initialisieren, also ein Objekt vom Typ TcpClient zuweisen.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    Weil Du später außerhalb von Button1_Click keinen Zugriff auf tcpClient hast, da es eine lokale Variable in jener Sub ist => tcpClient ist nicht mehr per .Close schließbar. Von anderen Methoden ganz abgesehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    klar. nochmal ne frage (ob ich das richtig verstehe) :

    aus der microsoft-doku :

    ' For customer1, call the constructor that takes no arguments.
    Dim customer1 As New Customer()

    ' For customer3, declare an instance of Customer in the first line
    ' and instantiate it in the second.
    Dim customer3 As Customer
    customer3 = New Customer()

    .... in fall 1 (so wie ich das ja auch geschrieben hab), wird vom konstruktor direkt ein objekt erzeugt. das mit close() zerlegt wird und dann nicht nochmal funktioniert.

    .... in fall 3 (so habt ihr das -funktionsfähig - geschrieben), wird zunächst eine instanz "deklariert" : was heißt das ? wie ne variable, also der speicherplatz reserviert ? das ist noch kein objekt ? , und dann kommt der konstruktor und schreibt da rein ??

    klassenfeind schrieb:

    wieso geht das dann so nicht :
    Dim tcpClient as New TcpClient
    Hier wird eine lokale Variable des Namens tcpClient vom Typ TcpClient angelegt.
    Diese hat mit der Klassenvariablen gleichen Namens nix zu tun, und sobald die Prozedur wieder vewrlassen wird, wird diese Variable gelöscht.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Zu Fall 3: Das ist der klassische Weg (so kenn ich es von Anfang der 90er Jahre, als ich mit QBasic anfing). Es wird dem Programm in jenem Bereich mitgeteilt: »Hier haben wir eine Variable von einem bestimmten Typ. Dem guten Stück wird noch kein Wert zugewiesen, das kommt erst später.« Das führt dazu, dass man sich um die Zuweisung eines Wertes zu geeignetem späteren Zeitpunkt kümmert. Allerdings kann für den entsprechenden Codebereich jene Variable verwendet werden und Methoden für sie angegeben werden (da sollte man nur sicherstellen, dass die Variable auch einen Wert hat, sonst gibt's nen Crash). Nicht immer ist es sinnvoll, einer Variablen gleich etwas zuzuweisen. Ein Beispiel wäre, wenn man eine Objektinstanz mit einem Konstruktor aufruft, der einen Parameter erfordert, den aber nur über eine Funktion mitteilen will.

    VB.NET-Quellcode

    1. Dim ExampleClassInstance As ExampleClass = Nothing
    2. Public Sub Create(SpecialParameter As Integer)
    3. ExampleClassInstance = New ExampleClass(SpecialParameter)
    4. End Sub


    Erst Jahre später kam die verkürzte Variante ergänzend* dazu: Dim tcpClient As New TcpClient: Die Variable wird nicht nur bekannt gegeben, sondern ihr wird auch gleich ein konkreter Wert bzw. eine konkrete Objektinstanz zugewiesen.

    *d.h.: man kann sie verwenden, wenn es für das konkrete Problem sinnvoll ist
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«