Stoppen eines Mutltiservers TCP/IP

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Stoppen eines Mutltiservers TCP/IP

    Seit einigen Tagen beschäftigt mich das Problem, dass stoppen eines Multiservers , alles andere funktioniert prima, bis auf die Verbindung wieder zu beeden z.B. durch abbruch vom User (Form schließen und ähnliches). Ich mache alles mit Threading, aber wenn ich versuche den Server zu stoppen, freezt einfach alles :thumbdown: .

    Der Code:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.IO
    4. Public Class Form1
    5. Dim started As Boolean = False
    6. Private server As TcpListener
    7. Private client As New Sockets.TcpClient
    8. Private IPPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 5358)
    9. Private Delegate Sub Auswerten(ByVal s As String)
    10. Private Delegate Sub AddItem(ByVal c As Connection)
    11. Private Delegate Sub DelItem(ByVal c As Connection)
    12. Private tmp As String
    13. Private main As New System.Threading.Thread(AddressOf StartServer)
    14. Dim connections As New List(Of Connection)
    15. Private Structure Connection
    16. Dim stream As NetworkStream
    17. Dim streamw As StreamWriter
    18. Dim streamr As StreamReader
    19. Dim lst As ListViewItem
    20. End Structure
    21. Sub StopServer()
    22. main.Abort()
    23. For Each c As Connection In connections
    24. c.stream.Close()
    25. c.streamr.Close()
    26. c.streamw.Close()
    27. Next
    28. server.Stop()
    29. client.Close()
    30. End Sub
    31. Sub StartServer(ByVal port As Integer)
    32. IPPoint = New IPEndPoint(IPAddress.Any, port)
    33. server = New TcpListener(IPPoint)
    34. server.Start()
    35. While True
    36. Try
    37. client = server.AcceptTcpClient
    38. Catch
    39. Exit Sub
    40. End Try
    41. Dim c As New Connection
    42. c.stream = client.GetStream
    43. c.streamr = New StreamReader(c.stream)
    44. c.streamw = New StreamWriter(c.stream)
    45. c.lst.Text = c.streamr.ReadLine
    46. connections.Add(c)
    47. Me.Invoke(New AddItem(AddressOf AddItem1), c)
    48. Dim t As New System.Threading.Thread(AddressOf Listen)
    49. t.Start(c)
    50. End While
    51. End Sub
    52. Private Sub Listen(ByVal con As Connection)
    53. Do
    54. Try
    55. tmp = con.streamr.ReadLine
    56. Me.Invoke(New Auswerten(AddressOf Auswerten1), tmp)
    57. Catch ex As Exception
    58. Me.Invoke(New DelItem(AddressOf DelItem1), con)
    59. Exit Do
    60. End Try
    61. Loop
    62. End Sub
    63. Private Sub AddItem1(ByVal c As Connection) ' User hinzufügen
    64. ListView1.Items.Remove(c.lst)
    65. End Sub
    66. Private Sub DelItem1(ByVal c As Connection) 'User wieder löschen
    67. ListView1.Items.Remove(c.lst)
    68. End Sub
    69. Private Sub Auswerten1(ByVal s As String)
    70. MsgBox(tmp)
    71. End Sub
    72. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    73. If started = False Then
    74. Button1.Text = "Stop"
    75. started = True
    76. main.Start()
    77. Else
    78. Button1.Text = "Start"
    79. started = False
    80. StopServer()
    81. End If
    82. End Sub
    83. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    84. Application.Exit()
    85. End Sub
    86. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    87. e.Cancel = False
    88. StopServer()
    89. e.Cancel = True
    90. End Sub
    91. End Class


    MfG :thumbsup:
    Achso:) sry falsch verstanden.

    Mit Stream beenden ist es nicht getan, du musst wahrscheinlich noch den Clienten selber beenden.
    Eine unbeabsichtige Verbindungsunterbrechung zu überwachen ist sowieso nicht einfach, außer du sendest alle paar Sek nen Ping am Client und schaust ob er was zurück gibt.

    Und versuch mal dein Listing-Thread im Hintergrund laufen zu lassen, vllt hilft das schon.

    Edit:
    Und mach mal deine Try-Catch raus und dann siehst du welche Fehlermeldung Visual Studio dir sagt. Ich weiß das ich das Problem auch öfters hatte, nur weiß ich nimmer so genau was ich gemacht hatte.
    Achja glaube wir kennen uns auch ausn anderen Forum oder?! :)
    Der Aufruf von Server.Stop unterbricht den blockierenden Vorgang AcceptTcpClient. Du springst in Deinem Code dann aus der Sub, was den Thread beendet. Somit musst Du den Thread wieder neu instanzieren, da er mit seiner Arbeit fertig ist.

    Ich empfehle Dir ohnehin das da: vb-paradise.de/allgemeines/sou…leistungsfaehigem-server/

    Dein Ansatz mag zwar OK sein, jedoch läufst Du, wie Du ja feststellst, schon in Probleme. Du kannst die Zusammenhänge nicht mehr erfassen. Mit zunehmenden Umfang Deines Programms wird das nicht besser. Ferner geht die Performance mit steigender Nutzerzahl in die Knie. Schau Dir das Beispiel mal genau an.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Danke ! :) jetzt gehts :D

    Edit:// Jetzt lässt sich die Form nicht mehr schließen..

    VB.NET-Quellcode

    1. Sub StopServer()
    2. 'Wenn ich hier den Thread beenden will, freezt die Form
    3. For Each c As Connection In connections
    4. c.stream.Close()
    5. c.streamr.Close()
    6. c.streamw.Close()
    7. Next
    8. server.Stop()
    9. client.Close()
    10. main.Abort()
    11. End Sub
    12. While started
    13. Try
    14. client = server.AcceptTcpClient
    15. Catch
    16. Exit Sub
    17. End Try
    18. Dim c As New Connection
    19. c.stream = client.GetStream
    20. c.streamr = New StreamReader(c.stream)
    21. c.streamw = New StreamWriter(c.stream)
    22. c.lst.Text = c.streamr.ReadLine
    23. connections.Add(c)
    24. Me.Invoke(New AddItem(AddressOf AddItem1), c)
    25. Dim t As New System.Threading.Thread(AddressOf Listen)
    26. t.IsBackground = True
    27. t.Start(c)
    28. End While
    29. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    30. e.Cancel = False
    31. StopServer()
    32. e.Cancel = True
    33. End Sub

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

    Lass das .Abort() weg. Wie ich Dir sagte. Ein Thread ist beendet, wenn er seine Aufgabe beendet hat. Kein Grund, den irgendwie zu aborten.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o