Networkstream für erneute Benutzung reseten vb.net

Hallo liebe Experten,
Ich habe folgendes Problem:
Ich programmiere momentan das WinsockControl von VB6 für das VB.NET Compact Framework 2.0 nach.
Dafür dimensioniere ich folgende Objekte:

Private TCP_Client As New System.Net.Sockets.TcpClient()
Private TCPListen As System.Net.Sockets.TcpListener
Private TCPListenInput As System.Net.Sockets.TcpClient
Private ServerStream As System.Net.Sockets.NetworkStream
Private ClientStream As System.Net.Sockets.NetworkStream

Der TCP_Client und der ClientStream ist für den fall das der Socket irgendwo hin verbinden soll und TCPListen, TCPListenInput und der ServerStream dafür, dass der Socket einen Port abhört.
Um die Sockets zu resetten wird folgendes ausgeführt:

TCP_Client.Close()
TCPListenInput.Close()
TCPListen.Stop()

Doch bei „TCPListenInput.Close()“ tritt eine „NullReferenceException“ auf. Wenn ich den Fehler mit „Try/Catch/End Try“ verschlucken lasse, tritt beim erneuten Verbinden,

TCP_Client.Connect(IPAddress, Port)
ClientStream = TCP_Client.GetStream()

bei „ClientStream = TCP_Client.GetStream()“ eine „ObjectDisposedException“ auf.
Ich vermute, das liegt daran das ich den Stream nicht geschlossen habe bevor ich neu verbunden habe.
Bei: „ClientStream.Close()“ und „ClientStream = Nothing“ tritt jedoch wieder der Fehler „NullReferenceException“.

Jetzt ist meine Frage wie ich den Stream schließen kann.
Schonmal Danke im Vorraus!

Hallo,

ObjectDisposedException bedeuted, dass Dispose auf diesem Object aufgerufen wurde, evt. geschieht dies indirekt durch Close(). Wenn eine Klasse in diesem Zustand ist, ist sie nicht mehr benutzbar und warted auf den Garbage Collector :smile:

Versuch mal, alle benötigten Objekte mit New neu anzulegen, dass sollte dann gehen.

Grüße
McGee

Vielen Dank für die schnelle Antwort! Funktioniert einwandfrei, bis auf eine kleine Sache:

Beim Ersten mal funktioniert Alles, ist klar ist ja Alles dimensioniert.
Beim Schließen des Sockets führe ich jetzt folgenden Code aus:

ClientStream = Nothing
ServerStream = Nothing
TCPListenInput = Nothing
TCPListen.Stop()

hierbei tritt kein Fehler auf, jedoch wenn ich jetzt wieder neu verbinde und dann auf den Stream (ClientStream) zugreife indem ich etwas sende tritt ein Fehler auf (Selber Fehler wie vorher „Disposed“) , welcher besagt dass, das Objekt geschlossen ist, jedoch bricht das Programm nicht ab und die Daten die ankommen sollen kommen an. Ich würde diese lästige Meldung jedoch recht gerne los bekommen.

Meine Frage ist daher: Wie kann ich den Stream neu dimensionieren wenn er vorher „Elementweit“ dimensioniert wurde?

ClientStream = New System.Net.Sockets.NetworkStream

funktioniert nicht, da es eigentlich so aussehen sollte:

ClientStream = New System.Net.Sockets.NetworkStream()

jedoch nutze ich keinen Socket sondern einen „TCPClient“.

Nochmal Danke im Vorraus!

Vielen Dank für die schnelle Antwort! Funktioniert
einwandfrei, bis auf eine kleine Sache:

Gerne!

Meine Frage ist daher: Wie kann ich den Stream neu
dimensionieren wenn er vorher „Elementweit“ dimensioniert
wurde?

ClientStream = New System.Net.Sockets.NetworkStream

funktioniert nicht, da es eigentlich so aussehen sollte:

ClientStream = New System.Net.Sockets.NetworkStream()

Wie beim Ersten mal:

ClientStream = TCP\_Client.GetStream()

Neuer TCP_Client, neuer Stream.

Was meinst Du mit Elementweit?

Kenne mich mit TCP_Client nicht aus, aber bei solchen Klassen ist es wichtig, herauszufinden, wer für das Schließen bzw. Freigeben von Resourcen verantwortlich ist.

Wenn Du nicht weiterkommst, poste bitte den gesamten Code, dann schaue ich nochmal hinein.

Viele Grüße
McGee

Nochmal Danke für die schnelle Antwort!

Ich programmiere ein „Benutzersteuerelement“ und mit „Elementweit“ meinte ich das der TCP_Client im gesamten „Benutzersteuerelement“ ansprechbar ist und nicht nur in einer Sub im Element.

Genauso ( ClientStream = TCP_Client.GetStream() ) hab ich es auch gemacht. Doch es treten immer 2 „Disposed“ Fehler auf wenn ich etwas schicke. Allerdings treten diese 2 Fehler einmalig auf und das Programm wird auch nicht abgebrochen, es läuft einfach weiter. Deswegen weiß ich nicht wo genau die Fehler auftreten.
Sie stören den letztendlichen Nutzer eigentlich nicht, da die Fehler das Programm nicht abbrechen, aber ich hätte sie doch ganz gerne weg.