Socket - Daten empfangen gelingt nicht

  • VB.NET

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

    Socket - Daten empfangen gelingt nicht

    Hi,

    Ich möchte diverse Daten per System.Net.Sockets empfangen. Das senden gelingt mir schon. Das Problem ist aber, das beim empfangen das Programm crasht und immer nur dieser Fehler kommt. Ich hab es mit Google probiert, aber dort sind nur tuts, wie man socket mit Tcpclient und Tcplistener verwendet (Was ich aber nicht will).

    Der Fehler:
    Fehler: System.ObjectDisposedException: Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "System.Net.Sockets.Socket".
    bei System.Net.Sockets.Socket.get_Available()
    bei SocketTest.Module1.Main() in C:\Users\gespa1\AppData\Local\Temporary Projects\SocketTest\Module1.vb:Zeile 29.

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Text
    3. Imports System.Net
    4. Module Module1
    5. Sub Main()
    6. Dim client As Socket
    7. Console.Write("IP-Adresse: ")
    8. Dim ip As String = Console.ReadLine()
    9. Console.Write("Port: ")
    10. Dim port As String = Console.ReadLine()
    11. While (True)
    12. Console.Write("Text[Go]:")
    13. Dim Input As String = Console.ReadLine
    14. If Input.Trim = Nothing Then Input = "Go"
    15. Dim data As Byte() = Encoding.ASCII.GetBytes(Input)
    16. Try
    17. client = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    18. Dim portSelect As Integer = Convert.ToInt16(port)
    19. client.Bind(New IPEndPoint(IPAddress.Any, 80))
    20. Dim remoteIPAddress As System.Net.IPAddress = System.Net.IPAddress.Parse(ip)
    21. Dim remoteEndPoint As New System.Net.IPEndPoint(remoteIPAddress, portSelect)
    22. client.Connect(remoteEndPoint)
    23. client.Send(data)
    24. client.Close()
    25. Dim bytesReceived As Integer = client.Available
    26. Dim buffer As Byte() = New Byte(bytesReceived - 1) {}
    27. Dim byteCount As Integer = client.Receive(buffer, bytesReceived, SocketFlags.None)
    28. Dim received As New String(Encoding.ASCII.GetChars(buffer))
    29. Console.WriteLine(received)
    30. Catch Ex As Exception
    31. Dim restore_color = Console.ForegroundColor
    32. Console.ForegroundColor = ConsoleColor.Red
    33. Console.WriteLine("Fehler: " & Ex.ToString)
    34. Console.ForegroundColor = restore_color
    35. End Try
    36. End While
    37. End Sub
    38. End Module


    Verstehe nicht, wo der Fehler liegen soll ?(

    mfg

    gfc

    VB.NET-Quellcode

    1. client.Close()

    kann es vieleicht das sein ?
    nämlich wenn du ihn schließt ist der stream und alle sachen von client weg :)
    einfach mal ausprobieren :)

    MFg BlackNetworkBit
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Weil Du den Client schliesst und danach noch client.Available abrufst. Nach dem Close ist der Socket Nothing. Ferner, nur ein ServerSocket ruft Bind() auf. Für einen Client reicht das Connect.

    Darum, als allererstes immer Try-Catch weg, wenn was nicht geht und die IDE markiert Dir sogar die Zeile. Man wills nicht glauben..
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So, habe diverse Zeilen geändert.

    VB.NET-Quellcode

    1. client.Send(data)
    2. Dim bytesReceived As Integer
    3. A: bytesReceived = client.Available
    4. If bytesReceived = 0 Then GoTo A
    5. Dim buffer As Byte() = New Byte(bytesReceived - 1) {}


    Das Problem war auch, das ich keine if-überprüfung drin hatte. Denn sonst geht er einfach weiter, egal ob was da ist oder nicht ^^

    Danke, Problem Gelöst

    mfg

    gfc
    bitte benutzte kein Goto .. es kommen aus der Höhle :P
    es gibt immer eine bessere Lösung :) zb könntest du da eine do Loop schleife basteln

    MFg BlackNetworkBit
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Du brauchst überhaupt nicht abfragen, ob Daten "available" sind. Treffen Daten ein, so werden diese gelesen und die Anzahl der empfangenen Bytes wird Dir ebenfalls mitgeteilt. Überdenke Deine "Architektur" der ganzen Sache.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Da alles in einer Konsole stattfindet, und ich nur daten auslesen möchte, wenn ich welche erwarte, sollte meine möglichkeit doch am besten sein?
    Schau Dir mal das an.

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.Text
    4. Module Module1
    5. Private _client As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    6. Sub Main()
    7. Try
    8. Dim a As Action = AddressOf ReceiveFromServer
    9. _client.Connect(New IPEndPoint(IPAddress.Parse("192.168.33.225"), 39999))
    10. a.BeginInvoke(Nothing, Nothing)
    11. Catch ex As SocketException
    12. Console.WriteLine("Could not connect")
    13. End Try
    14. Console.ReadLine()
    15. End Sub
    16. Private Sub ReceiveFromServer()
    17. Do
    18. Dim buffer(1024) As Byte
    19. Dim recLen As Integer = 0
    20. Dim recMessage As String = String.Empty
    21. Try
    22. recLen = _client.Receive(buffer, SocketFlags.None)
    23. If recLen = 0 Then
    24. Throw New Exception()
    25. End If
    26. Catch ex As Exception
    27. _client.Close()
    28. Exit Sub
    29. End Try
    30. recMessage = Encoding.UTF8.GetString(buffer, 0, recLen)
    31. Console.WriteLine(recMessage)
    32. Loop
    33. End Sub
    34. End Module
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o