[.NET] Sluiten van socket

Pagina: 1
Acties:

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik heb een client die geschreven is in VB 6 die gebruik maakt van een server in VB.NET. Nu laat ik de client de socket.state controleren voor het geval de verbinding wordt verbroken.

Op de server maak ik een Thread aan die een sub DoListen aanroept. In de DoListen wordt er een TCPListener op poort 8000 gestart. Elke keer als er een nieuwe verbinding wordt gemaakt doe ik New Client(listener.AcceptTCPListener). De socket.state van de client is dan 7 oftwel connected.

Als ik de applicatie afsluit via form_closing dan zeg ik TcpListsener.Stop() en Thread.Abort(). De client krijgt dan een socket.state 9 oftwel een error.

Nu het probleem: Als ik hetzelfde doe (TcpListener.Stop() en Thread.Abort()) in een sub die aangeroepen wordt door middel van Stop server in een menu en de applicatie blijft voor de rest aanwezig dan krijgt de client geen socket-error en denkt hij dat de server er nog steeds is.

Ik wil graag de server kunnen stoppen met meldingen bij de clients zonder het gehele programma af te sluiten.

code:
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
<< Server starten: >>

Private Sub MenuItem2_Click(.....) Handles MenuItem2.Click
    mobjThread = New Thread(AddressOf DoListen)
    mobjThread.Start()
End Sub

Private Sub DoListen()
    mobjListener = New TcpListener(8000)
    mobjListener.Start()
    Do
        Dim x As New Client(mobjListener.AcceptTcpClient)
    Loop Until False
End Sub

<< Afsluiten gehele applicatie: >>

Private Sub frmMain_Closing(......) Handles MyBase.Load
    If Not (mobjListener Is Nothing) Then
        mobjListener.Stop()
    End If
    If Not (mobjThread Is Nothing) Then
        mobjThread.Abort()
    End If
End Sub

<< Alleen server stoppen >>

Private Sub MenuItem3_Click(.....) Handles MenuItem3.Click
    If Not (mobjListener Is Nothing) Then
        mobjListener.Stop()
    End If
    If Not (mobjThread Is Nothing) Then
        mobjThread.Abort()
     End If
End Sub

[ Voor 0% gewijzigd door Stimpy001 op 11-10-2002 13:24 . Reden: sourcecode toegevoegd ]

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


Verwijderd

Ik ben met iets dergelijks bezig op het moment en ik heb hetzelfde probleem.

Iets wat ik niet getest heb, maar misschien wel werkt is het bijhouden van een clientpool. Een ArrayList met clients, zodra de tcpListener gestopt moet worden, loop je deze clients door, sluit overal handmatig de connectie om vervolgens de tcpListener te stoppen. Misschien werkt het.

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik heb inderdaad een Hashtable met hierin alle clients. Ik heb ookal geprobeert om overal handmatig de connectie te sluiten maar dat werkt ook niet. Pas als de applicatie echt afgesloten is, heeft de client in de gaten dat er geen connectie meer is.

Volgens mij doe jij het in C# en ik in VB, het gaat volgens mij om het voorbeeld van Multi-user TCp Chat Application. Ik zag namelijk ook nog een ander bericht van jou over het opvragen van de IP van de clients. Dat wil ik ook doen maar daar kom ik ook niet uit in VB

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


Verwijderd

Klopt, ik werk in C#, maar .NET is .NET dus dat moet niet uitmaken. Maar ook ik heb problemen met het sluiten van connecties. Als ik gewoon een client afsluit dan merkt de client dit pas na een paar minuten, geen idee hoe dat kan.

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik ben inmiddels overgestapt op AcceptSocket maar dan krijg ik een zogenaamde race-condition. Mijn Hastable met clients wordt tijdens het doorlopen ervan aangepast. Op het moment dat je dan bij Next komt, vindt .NET niet echt leuk. Daar zal ik aankomend weekend maar eens over na denken

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.