Hi zusammen,
ich habe ein kleines Problem mit einer "UdpConnection" Klasse die ich erstellt habe. Ich wollte eine ganz simple Klasse erstellen, die ich auf Server- sowie auf Clientseite einsetzen kann um mittels Broadcast im lokalen Netzwerk nach den entsprechenden gegenstellen zu suchen.
Und zwar soll das ganze so ablaufen, das jenachdem welchen spezifischen Befehl ich mittels Broadcast raussende sich entsprechend alle Clients, bzw. der Server zurückmelden.
Wird etwas empfangen, wird ein Event ausgelöst, in welchem dann ausgewertet wird worum es sich genau handelt (dieser Teil funktioniert einwandfrei).
Nur momentan ist es so, das ich erst mal exakt das empfange, was ich selber zuvor per Broadcast gesendet habe. Das scheint mir aber irgendwie noch logisch und richtig zu sein? Also ist mein erstes Problem anhand der IP zu filtern ob die Message von mir selber kommt und dann dementsprechend diese nicht weiter zu verarbeiten, sondern zu verwerfen. Ich habe das momentan so gelöst, das ich mir eine Funktion gebastelt habe, welche die empfangene IP mit der IP von meinem PC vergleicht. Aber irgendwie gefällt mir diese Lösung noch nicht. Gibt es da eine andere Lösung für?
Das andere und schwerwiegendere Problem ist, das nicht immer auf jede Anfrage die ich sende eine Antwort zurück kommt. Bzw. ich habe jetzt mal auf Server- und Clientseite debuggt und herausgefunden, das ich immer eine Anfrage raussende, diese auch auf der Gegenstelle ankommt und die Gegenstelle auch antwortet. Ich empfange nur nichts auf der Seite von der ich die Anfrage gesendet habe. Ich habe aktuell keine Ahnung woran das liegen kann? Das ist aber auch nicht immer so, manchmal funktioniert es. Kann es etwas damit zu tun haben das alle Teilnehmer versuchen gleichzeitig mir die Rückmeldung zu senden? Getestet habe ich es mit einem Server und 2 Clients im Netzwerk. Besonders auffällig ist dieses Phänomen, wenn längere Zeit keine Anfrage über die Udp-Verbindung gesendet wurde. Kurz nach dem Start der Testapplikationen funktioniert es meistens?
Hier noch die Klasse der Udp-Verbindung:
Spoiler anzeigen
Ich hoffe Ihr könnt mir weiterhelfen?
Vielen Dank schonmal!!!
ich habe ein kleines Problem mit einer "UdpConnection" Klasse die ich erstellt habe. Ich wollte eine ganz simple Klasse erstellen, die ich auf Server- sowie auf Clientseite einsetzen kann um mittels Broadcast im lokalen Netzwerk nach den entsprechenden gegenstellen zu suchen.
Und zwar soll das ganze so ablaufen, das jenachdem welchen spezifischen Befehl ich mittels Broadcast raussende sich entsprechend alle Clients, bzw. der Server zurückmelden.
Wird etwas empfangen, wird ein Event ausgelöst, in welchem dann ausgewertet wird worum es sich genau handelt (dieser Teil funktioniert einwandfrei).
Nur momentan ist es so, das ich erst mal exakt das empfange, was ich selber zuvor per Broadcast gesendet habe. Das scheint mir aber irgendwie noch logisch und richtig zu sein? Also ist mein erstes Problem anhand der IP zu filtern ob die Message von mir selber kommt und dann dementsprechend diese nicht weiter zu verarbeiten, sondern zu verwerfen. Ich habe das momentan so gelöst, das ich mir eine Funktion gebastelt habe, welche die empfangene IP mit der IP von meinem PC vergleicht. Aber irgendwie gefällt mir diese Lösung noch nicht. Gibt es da eine andere Lösung für?
Das andere und schwerwiegendere Problem ist, das nicht immer auf jede Anfrage die ich sende eine Antwort zurück kommt. Bzw. ich habe jetzt mal auf Server- und Clientseite debuggt und herausgefunden, das ich immer eine Anfrage raussende, diese auch auf der Gegenstelle ankommt und die Gegenstelle auch antwortet. Ich empfange nur nichts auf der Seite von der ich die Anfrage gesendet habe. Ich habe aktuell keine Ahnung woran das liegen kann? Das ist aber auch nicht immer so, manchmal funktioniert es. Kann es etwas damit zu tun haben das alle Teilnehmer versuchen gleichzeitig mir die Rückmeldung zu senden? Getestet habe ich es mit einem Server und 2 Clients im Netzwerk. Besonders auffällig ist dieses Phänomen, wenn längere Zeit keine Anfrage über die Udp-Verbindung gesendet wurde. Kurz nach dem Start der Testapplikationen funktioniert es meistens?
Hier noch die Klasse der Udp-Verbindung:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Text
- Imports System.Net
- Public Class udpConnection
- Private UdpListener As UdpClient ' horchen
- Private UdpListenerPort As Integer = 9654
- Private UdpSender As UdpClient ' senden
- Private ep As IPEndPoint
- Private CallBack As AsyncCallback ' asyncrones Empfangen
- Delegate Sub DelegateWriteRtf(ByVal t As String)
- Private Const broadcastAddress As String = "255.255.255.255"
- Public Event MessageReceived(ByVal sender As udpConnection, ByVal msg As String, ByVal msg_source As String)
- #Region "Constructor"
- Sub New()
- StartListener()
- End Sub
- #End Region
- ' Startet den UDP Client zum horchen
- Private Sub StartListener()
- CallBack = New AsyncCallback(AddressOf Receive)
- ep = New IPEndPoint(IPAddress.Any, UdpListenerPort)
- UdpListener = New UdpClient(ep)
- UdpListener.EnableBroadcast = True
- UdpListener.BeginReceive(CallBack, "") ' startet asyncrones Empfangen
- End Sub
- ' Diese Sub wird in einem eigenen Thread ausgeführt
- Sub Receive(ByVal ar As IAsyncResult)
- Dim res() As Byte = UdpListener.EndReceive(ar, ep)
- Dim resString = Encoding.ASCII.GetString(res)
- If Not ep.Address.ToString = Netzwerkverbindung.IPs_v4.Item(0).ToString Then
- RaiseEvent MessageReceived(Me, resString, ep.Address.ToString)
- End If
- 'SyncLock UdpListener
- If ar.IsCompleted Then ' wenn fertig, wieder lauschen
- UdpListener.BeginReceive(CallBack, "")
- 'UdpListener.BeginReceive(New AsyncCallback(AddressOf Receive), ar.AsyncState)
- End If
- 'End SyncLock
- End Sub
- Public Sub Send(ByVal Command As String, ByVal TargetIP As String)
- If UdpSender Is Nothing Then
- UdpSender = New UdpClient()
- End If
- If Not Command = String.Empty Then
- Dim b() As Byte = Encoding.ASCII.GetBytes(Command)
- UdpSender.Send(b, b.Length, TargetIP, UdpListenerPort)
- End If
- End Sub
- Public Sub Send_Broadcast(ByVal Command As String)
- If UdpSender Is Nothing Then
- UdpSender = New UdpClient()
- End If
- If Not Command = String.Empty Then
- Dim b() As Byte = Encoding.ASCII.GetBytes(Command)
- UdpSender.Send(b, b.Length, broadcastAddress, UdpListenerPort)
- End If
- End Sub
- End Class
Ich hoffe Ihr könnt mir weiterhelfen?
Vielen Dank schonmal!!!