abonnement Unibet Coolblue Bitvavo
pi_66934867
quote:
Op woensdag 11 maart 2009 13:32 schreef toma het volgende:

[..]

Ik declareer mijn tcpclient aan het begin van het programma als je dat soms bedoeld.
[ code verwijderd ]

Daarna volgt de code die ik vanochtend heb gepost.

Moet ik deze tcpclient dan 'afsluiten' ? Ik snap het niet, maar dat komt ook omdat dit de eerste keer is dat ik met VB.NET werk.
Een tcpclient object open je altijd met [tcpclient-objectnaam].connect() en dien je weer te sluiten met [tcpclient-objectnaam].close(). Dat doe jij in je stukje code ook, echter zie ik dat jouw Close() commando plaatsvindt in Function Disconnect, die op z'n beurt weer uitgevoerd word door Button2_Click(). Wordt Button2_Click() wel áltijd uitgevoerd? Wordt de tcpclient wel geclosed als je de applicatie bijvoorbeeld gewoon 'afsluit' middels het kruisje van je venster?
pi_66935027
quote:
Op woensdag 11 maart 2009 14:24 schreef Tuvai.net het volgende:

[..]

Een tcpclient object open je altijd met [tcpclient-objectnaam].connect() en dien je weer te sluiten met [tcpclient-objectnaam].close(). Dat doe jij in je stukje code ook, echter zie ik dat jouw Close() commando plaatsvindt in Function Disconnect, die op z'n beurt weer uitgevoerd word door Button2_Click(). Wordt Button2_Click() wel áltijd uitgevoerd? Wordt de tcpclient wel geclosed als je de applicatie bijvoorbeeld gewoon 'afsluit' middels het kruisje van je venster?
Dat is niet zo zeer het probleem.
Ik zet een verbinding op dmv Button1. Daarna krijg ik constant data toegestuurd. Wanneer ik op Button2 druk moet de verbinding afgesloten worden. Het probleem is dat wanneer ik weer op Button1 druk dat ie dan de volgende foutmelding geeft:
pi_66937509
Ik heb de code aangepast.
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
Public Class Form1
    Public Client As New Net.Sockets.TcpClient
    Public Udpclient As New Net.Sockets.UdpClient

    Dim packet As String

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Connectie("10.0.10.99", 10000)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Disconnect()
    End Sub

    Function Connectie(ByVal ip As String, ByVal poort As Integer)

        Try
            If Client.Connected = 0 Then
                Client.Connect(ip, poort)
                TextBox1.Text = ("Connecting")
            Else
                TextBox1.Text = ("Already Connected!")
            End If
        Catch Exception1 As Net.Sockets.SocketException
            packet = "h"
            Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(packet)
            Udpclient.Send(data, data.Length, ip, 10001)
            Udpclient.Close()
            MessageBox.Show("Error 1: " & Exception1.Message)
            TextBox1.Text = ("Error")
        Catch Exception2 As ObjectDisposedException
            Dim Client As New Net.Sockets.TcpClient
            MessageBox.Show("Error 2: " & Exception2.Message)
            TextBox1.Text = ("Error")
        Catch Exception3 As NullReferenceException
            MessageBox.Show("Error 3: " & Exception3.Message)
        End Try
    End Function

    Function Disconnect()
        Try
            Client.Close()
            TextBox1.Text = ("Disconnecting")
        Catch Exception1 As Net.Sockets.SocketException
            MessageBox.Show("Error 4: " & Exception1.Message)
            TextBox1.Text = ("Error")
        Catch Exception2 As ObjectDisposedException
            MessageBox.Show("Error 5: " & Exception2.Message)
            TextBox1.Text = ("Error")
        Catch Exception3 As NullReferenceException
            MessageBox.Show("Error 6: " & Exception3.Message)
            TextBox1.Text = ("Error")
        End Try
    End Function
End Class

Nu krijg ik de volgende foutmelding wanneer ik voor de tweede keer wil connecten.
  woensdag 11 maart 2009 @ 15:37:32 #29
44920 TallMan
Permanent brain failure
pi_66937619
Uit de help van de TcpClient
quote:
Close : Disposes this TcpClient instance without closing the underlying connection.
Dit verklaart nogal duidelijk waarom je een objectdisposedexception hebt kunnen vangen. Zeker erg onhandig omdat de connectie die er ligt naar je scanner open blijft waardoor een reconnect waarschijnlijk nogal moeilijk wordt (vaak willen dat soort apparaten maar 1 connectie accepteren)

Je TcpClient heeft een Client propertie van het type socket. Deze heeft een disconnect.

Mijn suggestie zou dan ook zijn om je Disconnect te veranderen van
1           Client.Close()

in
1           Client.Client.Disconnect()

Daarmee zeg je tegen de onderliggende socket dat de connectie afgebroken moet worden. Verder dispose je je object niet wat hergebruik nogal moeilijk maakt.

Overigens nog een tip:
ipv je exception.message en showen doe voor debuggen in ieder geval exception.ToString(), dan heb je een volledige stacktrace inclusief precies regelnummer waar je fout optrad.

[ Bericht 62% gewijzigd door TallMan op 11-03-2009 15:47:01 ]
geheelonthouder met geheugenverlies
Mensen die zeggen dat domme vragen niet bestaan stellen ze zelf.
pi_66961379
Bedankt voor de reactie, maar helaas werkt het nog niet.
Wanneer ik
1Client.Client.Disconnect(true)

of
1Client.Client.Disconnect(false)

gebruik dan krijg ik deze error:


Ik gebruik onderstaande code om te connecten:
1Client.Connect(ip, poort)

Wanneer ik deze verander in:
1Client.BeginConnect(ip, poort, callback, state)

Dan krijg ik geen error. Maar dan maakt hij ook geen verbinding meer.

Het vreemde is dat wanneer ik de VB applicatie afsluit en opnieuw opstart dat ik dan wél weer verbinding kan maken.
  donderdag 12 maart 2009 @ 10:58:45 #31
44920 TallMan
Permanent brain failure
pi_66962979
BeginConnect en zijn maatje EndConnect zijn zware overkill voor je, die maken het alleen moeilijker ipv je probleem op te lossen

Ik zou denk ik in de Connectie methode de volgende wijziging doen
1
2
3
4
5
6
            If Client.Connected = 0 Then
                Client.Connect(ip, poort)
                TextBox1.Text = ("Connecting")
            Else
                TextBox1.Text = ("Already Connected!")
            End If

naar
1
2
                Set Client = New System.Net.Sockets.TcpClient
                Client.Connect(ip, poort)
geheelonthouder met geheugenverlies
Mensen die zeggen dat domme vragen niet bestaan stellen ze zelf.
pi_66965521
Bedankt dat was het
Maar waarom moet ik die Client opnieuw declareren? Omdat het object gedisposed is?
pi_66966536
quote:
Op donderdag 12 maart 2009 12:07 schreef toma het volgende:
Bedankt dat was het
Maar waarom moet ik die Client opnieuw declareren? Omdat het object gedisposed is?
Zodra je objecten disposed, dan gooi je ze 'weg' zoals de handeling al impliceert. Het hele object wordt weggegooid en ook het geheugen dat het betreffende object in beslag nam komt weer vrij. Dit is heel belangrijk in daadwerkelijke applicaties. In bijvoorbeeld webapplicaties hoef je daar veel minder rekening te houden omdat een webpagina op de server á la minute geparsed en na het weergeven/presenteren aan de gebruiker meteen vernietigd wordt. Connecties naar apparatuur of databases werken dan weer anders. Je legt een verbinding met iets, en je webpagina/applicatie laat deze verbinding dus voor een tijdje open staan (idle) als je de verbinding niet sluit. Veel apparaten en databases vinden het op z'n beurt weer niet zo leuk om te veel openstaande verbindingen te hebben en hebben daar ook vaak een limiet aan.
  donderdag 12 maart 2009 @ 12:48:29 #34
44920 TallMan
Permanent brain failure
pi_66966850
Wat Tuvai zegt.

En schijnbaar is de TcpClient een beetje onhandig om hergebruikt te krijgen, zodra zoiets teveel moeite kost is het al snel makkelijker om een nieuwe te pakken.

Het.NET framework is wel weer zo aardig dat als jij dingen niet meer gebruikt hij het voor je opruimt. Neemt niet weg dat ik toch aanraad om netjes met je objecten om te springen, sockets/db connecties netjes disconnecten etc.

In de bovenstaande (werkende optie) maak je een nieuwe TcpClient aan die volledig vers in het geheugen komt te zitten. Het framework herkent dat jij nergens meer een verwijzing naar de oude TcpClient heeft en die ruimt het voor je op.
Niet alle talen zijn zo aaridg voor je, mocht je met C/C++ aan de slag moeten dan moet je zelf het opruimen regelen.
geheelonthouder met geheugenverlies
Mensen die zeggen dat domme vragen niet bestaan stellen ze zelf.
  donderdag 12 maart 2009 @ 14:12:19 #35
58834 Catbert
The evil HR Director.
pi_66969735
quote:
Op donderdag 12 maart 2009 12:38 schreef Tuvai.net het volgende:
Zodra je objecten disposed, dan gooi je ze 'weg' zoals de handeling al impliceert. Het hele object wordt weggegooid en ook het geheugen dat het betreffende object in beslag nam komt weer vrij. Dit is heel belangrijk in daadwerkelijke applicaties. In bijvoorbeeld webapplicaties hoef je daar veel minder rekening te houden omdat een webpagina op de server á la minute geparsed en na het weergeven/presenteren aan de gebruiker meteen vernietigd wordt.
FYI: Dat is in het geval van Asp.net en Java absoluut niet zo. Je hebt daar gewoon een application scope. Het is altijd zaak om dit soort objecten netjes op te ruimen, er is geen garantie dat de GC ze kan verwijderen, daarom hebben ze een dispose methode.
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')