WSACancelBlockingCall bei TCPListener!?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von okster.

    WSACancelBlockingCall bei TCPListener!?

    Hallo
    ich hoffe ihr könnt mir helfen
    ich arbeite grade ein bisschen mit TCPListener und TCPClients
    doch im meinem code trifft die socketException auf in der es heißt:
    Ein Blockierungsvorgang wurde durch den Aufruf von WSACancelBlockingCall unterbrochen
    einmal der code

    Meine Form1(ich hab eine listbox1 und ein button1 erstellt)

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text
    3. Imports System.Net
    4. Imports System.Net.Sockets
    5. Imports System.Threading
    6. Imports System.IO
    7. Public Class Server
    8. Dim Listener As TcpListener
    9. Dim Client As Client
    10. Dim thWartenverbindung As Thread
    11. Dim thStart As Thread
    12. Dim Clientstart As Boolean = False
    13. Private Sub Server_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    14. thWartenverbindung = New Thread(AddressOf AufVerbindungwarten)
    15. Listener = New TcpListener(GetHostIP, 5000)
    16. thStart = New Thread(AddressOf Start)
    17. End Sub
    18. Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdStartServer.Click
    19. Start()
    20. End Sub
    21. Sub Start()
    22. Listener.Start()
    23. thWartenverbindung = New Thread(AddressOf AufVerbindungwarten)
    24. thWartenverbindung.Start()
    25. Dim weiter As Boolean = False
    26. Do Until weiter = True
    27. If Clientstart = True Then 'Clientstart wird true wenn die sub aufverbindung warten connected hat
    28. Client.start()
    29. weiter = True
    30. End If
    31. Application.DoEvents()
    32. Loop
    33. Listener.Stop()
    34. End Sub
    35. Sub AufVerbindungwarten()
    36. Client = New Client(Listener.AcceptTcpClient)
    37. StatusAusgabe("Mit einem neuen Client connected!")
    38. Clientstart = True
    39. AddHandler Client.Meldung, AddressOf StatusAusgabe
    40. End Sub
    41. Public Delegate Sub DoStatusAus(ByVal Meldung As String)
    42. Private Sub StatusAusgabe(ByVal Meldung As String)
    43. If ListBox1.InvokeRequired Then
    44. Dim ParamListe() As Object = {Meldung}
    45. ListBox1.Invoke(New DoStatusAus(AddressOf DoStatusAusgabe), ParamListe)
    46. Else
    47. DoStatusAusgabe(Meldung)
    48. End If
    49. End Sub
    50. Private Sub DoStatusAusgabe(ByVal Meldung As String)
    51. ListBox1.Items.Add(Meldung)
    52. ' Zuletzt hinzugefügtes Element selektieren
    53. ListBox1.SetSelected(ListBox1.Items.Count - 1, True)
    54. End Sub
    55. Function GetHostIP() As IPAddress
    56. For Each IPAdr As IPAddress In Dns.GetHostEntry("oke-pc").AddressList
    57. If IPAdr.AddressFamily = AddressFamily.InterNetwork Then
    58. Return IPAdr
    59. End If
    60. Next
    61. Return IPAddress.Loopback
    62. End Function
    63. End Class



    Und Hier meine classe Client

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text
    3. Imports System.Net
    4. Imports System.Net.Sockets
    5. Imports System.Threading.Thread
    6. Imports System.Threading
    7. Public Class Client
    8. Dim Client As TcpClient
    9. Dim Ende As Boolean = False
    10. Dim Buffer(1024) As Byte
    11. Public Startthread As New Thread(AddressOf Startforthread)
    12. Event Meldung(ByVal Meldung As String)
    13. Sub New(ByVal x As TcpClient)
    14. Client = x
    15. End Sub
    16. Private Sub Startforthread()
    17. Try
    18. Ende = False
    19. Do Until Ende = True
    20. Dim ar As IAsyncResult
    21. ReDim Buffer(1024)
    22. ar = Client.GetStream.BeginRead(Buffer, 0, 1024, Nothing, Nothing)
    23. Client.GetStream.EndRead(ar)
    24. RaiseEvent Meldung(Encoding.Default.GetString(Buffer))
    25. Loop
    26. Catch
    27. If Client.Connected = False Then
    28. RaiseEvent Meldung("Ein Client hat die Verbindung unterbrochen")
    29. Else
    30. RaiseEvent Meldung("error!!")
    31. End If
    32. End Try
    33. End Sub
    34. Public Sub start()
    35. Startthread = New Thread(AddressOf Startforthread)
    36. Startthread.Start()
    37. End Sub
    38. End Class


    und falls es euch weiterhilft der client der sendet

    VB.NET-Quellcode

    1. Imports System.Text
    2. Imports System.Net.Sockets
    3. Public Class Form1
    4. Dim client As New TcpClient("oke-pc", 5000)
    5. Dim fisrst As Boolean = True
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. client.GetStream.BeginWrite(Encoding.Default.GetBytes(TextBox1.Text), 0, Encoding.Default.GetBytes(TextBox1.Text).Length, Nothing, Nothing)
    8. End Sub
    9. End Class


    als erste starte ich den server
    click auf button1
    und dann starte ich den server
    und sende was
    und dann schließ ich den server wieder
    und wenn ich dann den button1 nocheinmal clicke dann giebt er die fehlermeldung:
    Ein Blockierungsvorgang wurde durch den Aufruf von WSACancelBlockingCall unterbrochen


    Wisst ihr vielleicht was ich vergessen habe??
    ja das les ich mir gleich ma durch aber meine variante geht ja auch soweit außer wenn ich nach dem disconnecten noch einmal versuche zu connecten
    da muss ich ja irg was vergessen haben wieder rückgängig zu machen was beim ersten mal verändert wurde und nun beim zweiten mal stört
    ??
    vllt kann mir das ja jemand sagen