UDP bidirektionle Kommunikation

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    UDP bidirektionle Kommunikation

    Bin neu in VB.NET nach langen VB6.0 Jahren. Ich versuche gerade eine UDP peer-to-peer Kommunikation zwischen zwei lokalen Rechner aufzubauen. Leider klappt es nur in eine Richtung und ich befürchte meine Unkenntnis hat einige Fhler verursacht. Ich wäre sehr froh, wenn jemand auf die Sourcodes schauen und Rückmeldung geben könnte.
    Besten Dank

    VB.NET-Quellcode

    1. GB
    2. 'SENDER
    3. Imports System.Net.Sockets
    4. Public Class Form1
    5. Dim IP As String = "192.168.0.1" 'Beispiel IP
    6. Dim LocalPort As Integer = 8800 'Empfaenger-Port
    7. Dim Port As Integer = 8801 'Sender-Port
    8. Dim RemoteEndPoint As New Net.IPEndPoint(Net.IPAddress.Parse(IP), LocalPort)
    9. Dim Client As New UdpClient()
    10. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. 'Client.Connect(IP, Port)
    12. Dim ReceiveThread As New System.Threading.Thread(AddressOf ReceiveData)
    13. ReceiveThread.IsBackground = True
    14. ReceiveThread.Start()
    15. End Sub
    16. Private Sub ReceiveData()
    17. Dim Client As New UdpClient(LocalPort)
    18. Do
    19. Try
    20. Dim Data() As Byte = Client.Receive(Nothing)
    21. Dim Text As String = System.Text.Encoding.UTF8.GetString(Data)
    22. 'Die Variable Text enthält nun den Nachrichtentext
    23. ' MessageBox.Show(Text, "Umfrage")
    24. UpdateTextBox(Text)
    25. Catch Err As Exception
    26. 'Es ist ein Fehler aufgetreten
    27. End Try
    28. Loop
    29. End Sub
    30. Private Sub SendData()
    31. Dim Client As New UdpClient(LocalPort)
    32. Dim Text As String = TextBox2.Text
    33. Try
    34. Dim Data() As Byte = System.Text.Encoding.UTF8.GetBytes(Text)
    35. Client.Send(Data, Data.Length, RemoteEndPoint)
    36. Catch Err As Exception
    37. 'Es ist ein Fehler aufgetreten
    38. End Try
    39. End Sub
    40. Private Sub UpdateTextBox(ByVal number As String)
    41. If Me.InvokeRequired Then
    42. Dim args() As String = {number}
    43. Me.Invoke(New Action(Of String)(AddressOf UpdateTextBox), args)
    44. Return
    45. End If
    46. TextBox1.Text = TextBox1.Text & Chr(13) & Chr(10) & number
    47. End Sub
    48. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    49. End Sub
    50. End Class
    51. RECEIVER
    52. Imports System.Net.Sockets
    53. Public Class Form1
    54. Dim IP As String = "192.168.0.1" 'Beispiel IP
    55. Dim LocalPort As Integer = 8800 'Empfaenger-Port
    56. Dim Port As Integer = 8801 'Sender-Port
    57. Dim RemoteEndPoint As New Net.IPEndPoint(Net.IPAddress.Parse(IP), LocalPort)
    58. Dim Client As New UdpClient()
    59. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    60. 'Client.Connect(IP, Port)
    61. Dim ReceiveThread As New System.Threading.Thread(AddressOf ReceiveData)
    62. ReceiveThread.IsBackground = True
    63. ReceiveThread.Start()
    64. End Sub
    65. Private Sub ReceiveData()
    66. Dim Client As New UdpClient(LocalPort)
    67. Do
    68. Try
    69. Dim Data() As Byte = Client.Receive(Nothing)
    70. Dim Text As String = System.Text.Encoding.UTF8.GetString(Data)
    71. 'Die Variable Text enthält nun den Nachrichtentext
    72. ' MessageBox.Show(Text, "Umfrage")
    73. UpdateTextBox(Text)
    74. Catch Err As Exception
    75. 'Es ist ein Fehler aufgetreten
    76. End Try
    77. Loop
    78. End Sub
    79. Private Sub SendData()
    80. Dim Client As New UdpClient(LocalPort)
    81. Dim Text As String = TextBox2.Text
    82. Try
    83. Dim Data() As Byte = System.Text.Encoding.UTF8.GetBytes(Text)
    84. Client.Send(Data, Data.Length, RemoteEndPoint)
    85. Catch Err As Exception
    86. 'Es ist ein Fehler aufgetreten
    87. End Try
    88. End Sub
    89. Private Sub UpdateTextBox(ByVal number As String)
    90. If Me.InvokeRequired Then
    91. Dim args() As String = {number}
    92. Me.Invoke(New Action(Of String)(AddressOf UpdateTextBox), args)
    93. Return
    94. End If
    95. TextBox1.Text = TextBox1.Text & Chr(13) & Chr(10) & number
    96. End Sub
    97. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    98. End Sub
    99. End Class


    Edit by ~blaze~:
    *Codetag eingefügt*

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

    @gabente Willkommen im Forum. :thumbup:
    Zu UDP gugst Du hier.
    Asynchrone Clientsockets gugst Du hier.
    Asynchrone Serversocket gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    so wie ich das sehe, verwendest du hole punching, oder? Die Ports müssen einander ergänzen: LocalPort sollte auf Port und umgekehrt senden/empfangen. Du solltest eigentlich nicht zweimal den gleichen Port auf der gleichen IP-Adresse belegen können.

    Macht sich sonst ein Fehler bemerkbar?
    Die äußere Client-Variable scheint unnötig zu sein, bzw. eine der inneren. Eigentlich sollten wohl beide UdpClient-Instanzen auf Ebene der enthaltenden Klasse existieren.

    Kleine Anmerkungen:
    Verwende außerhalb von Methoden stets Public, Private, Protected, Friend oder Protected Friend statt Dim.
    Außerdem sollten nur für die UI-Funktionalität nötige Dinge in der Form sein.
    Alle Steuerelemente sollten Benennungen haben, die auf ihren Zweck rückschließen lassen.
    Räume Objekte, die IDisposable implementieren durch einen Aufruf von Dispose auf, sobald sie nicht mehr benötigt werden. UdpClient implementiert bspw. IDisposable.
    Statt Chr(13) & Chr(10) kannst du vbLfCr verwenden, statt Chr(10) vbLf.

    Viele Grüße
    ~blaze~

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

    ~blaze~ schrieb:

    außerhalb von Variablen
    ?(

    Meinstest du nicht eher außerhalb von Subs?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell