Laden...

UDP Broadcast senden und Antworten auswerten

Erstellt von Kaktusfan1707 vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.899 Views
K
Kaktusfan1707 Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren
UDP Broadcast senden und Antworten auswerten

Hi @ all,
ich versuche gerade per UDP über einen bestimmten Port Befehle rauszuschicken, die von bestimmten Geräten beantwortet werden. Von diesen Geräten möchte ich die IP-Adresse und Antwort auswerten. Habe schon mehrere Lösungen, die ich im Internet gefunden habe, ausprobiert. Doch bis jetzt funktioniert keine einzige. Glaube, dass ich momentan auf der Leitung stehe.
Kann es sein, dass ich zum Senden und Empfangen zwei Threads brauche? Codebeispiele wären toll.

Das Gerät ist ein kleiner PC mit einer Art Linux in einem speziellen Gehäuse. Bei einem meiner Tests kam als Antwort schon das richtige zurück. Allerdings war das kein Broadcast.

Die Anforderung ist, dass über den Port 62529 ein UDP-Befehl gesendet wird. In diesem Fall "Version". So kann ich also mit meinem C#-Programm feststellen wie viele Geräte im Netzwerk sind und welche IP sie haben. Anschließend kann ich im C#-Programm für jedes ein Profil anlegen und per SSH Daten holen.

Danke schon mal im Voraus.

1.361 Beiträge seit 2007
vor 10 Jahren

Hi Kaktusfan1707,

Router beschränken zumeist die Broadcast / Multicast Weiterleitung.
Wenn ein Broadcast in deinem Netzwerk nicht funktioniert, probiere mal eine gezieltere Multicast Addresse.
Aber behalte immer im Auge: Im Zielnetzwerk muss es funktionieren. Dort musst du es also auch testen.

Aber die UDP Pakete weitergeleitet werden, kannst du ja Testen, in dem du auf einem zweiten PC im selben Netz mal auf die UDP Pakete lauscht. Oder auch einfach Wireshark anmachst und mitloggst.

Mehrere Threads brauchst du nicht.
Wenn du nur eine Anfrage rausschickst, dann kannst du das blockierend machen und danach auf die Antworten warten.

Du kannst aber gerade bei den Antworten mit den Asynchronen Methoden der Sockets arbeiten.

beste Grüße
zommi

K
Kaktusfan1707 Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Habe folgendes ausprobiert, doch als Ergebnis kommt 7 zurück:

IPEndPoint ipEndpo;
            int port = 62529;

            try
            {

                String ip = "192.168.1.71";

                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, sizeof(int) == (-1));
                socket.Connect(IPAddress.Parse(ip), port);

                IPAddress ipAdr = IPAddress.Parse(ip);
                ipEndpo = new IPEndPoint(ipAdr, port);

                ASCIIEncoding enc = new ASCIIEncoding();

                String t = "Version";

                byte[] b = Encoding.ASCII.GetBytes(t);

                var ergebnis = socket.SendTo(b, SocketFlags.None, ipEndpo);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

Wenn ich Wireshark auf dem gleichen PC laufen lasse, seh ich die Nachricht "Version" oder die Antwort darauf nicht. Habe mit UDP vorher noch nichts gemacht und komm mir grad etwas überfordert vor.

R
212 Beiträge seit 2012
vor 10 Jahren

Hast du subnets oder verwendest du 192.168.1.71 nur als test?

Nimm doch direkt den UdpClient anstatt dich mit den soccets abzumühen.

http://msdn.microsoft.com/de-de/library/system.net.sockets.udpclient%28v=vs.110%29.aspx

[Zudem kann es öfter sein das du lange auf eine antwort warten musst und sich dein Propgramm in der zwischenzeit aufhängt. Desshalb ist es ratsam das entfangen der Antwort in ein BackgroudWorker oder sonstiges auszulagern.]

K
Kaktusfan1707 Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Mit dem habe ich es schon probiert und bei Receive hängt er sich auf.

Habe mit UDP noch nichts gemacht und hab deswegen keine Erfahrung damit.

R
212 Beiträge seit 2012
vor 10 Jahren

Hast du überhaupt eine gegenstelle die antwortet?

Wenn Receive sich aufhängt bekommst du anscheinend keine antwort.

K
Kaktusfan1707 Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Also der Programmierer von dem anderen Gerät sagt, dass er es mit einem speziellen Tool getestet hat und es funktioniert.

// This constructor arbitrarily assigns the local port number.
            UdpClient udpClient = new UdpClient(62529);
            try
            {
                //IPAddress host = new IPAddress(new byte[] { 10, 101, 209, 71 });
                udpClient.Connect("10.101.209.255", 62529);

                // Sends a message to the host to which you have connected.
                Byte[] sendBytes = Encoding.ASCII.GetBytes("Version");

                udpClient.Send(sendBytes, sendBytes.Length);

                // Sends a message to a different host using optional hostname and port parameters.
                //UdpClient udpClientB = new UdpClient();
                //udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 62529);

                //IPEndPoint object will allow us to read datagrams sent from any source.
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

                // Blocks until a message returns on this socket from a remote host.
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);

                // Uses the IPEndPoint object to determine which of these two hosts responded.
                Console.WriteLine("This is the message you received " +
                                             returnData.ToString());
                Console.WriteLine("This message was sent from " +
                                            RemoteIpEndPoint.Address.ToString() +
                                            " on their port number " +
                                            RemoteIpEndPoint.Port.ToString());

                udpClient.Close();
                //udpClientB.Close();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            Console.ReadLine();

Bei udpClient.Receive hängt er. Liegts also an mir oder am Gerät bzw. dem anderen Programmierer?

R
212 Beiträge seit 2012
vor 10 Jahren

Ließ dir mal genau den abschitt hier durch


// Blocks until a message returns on this socket from a remote host.

d.h. wenn du keine nachricht zurückbekommst wird der prozess auch nicht weiter gehen.


        public static void StartBackGroundProzess()
        {         
            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += new DoWorkEventHandler((bli, bla) => {/*DeinCode zum empfangen der nachricht*/});
            
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.RunWorkerAsync();
        }

        private static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //eine nachricht wurde empfangen
           //Wenn du hier nie ankommst bekommst du keine antwort :P
        }

K
Kaktusfan1707 Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Und wo rufe ich dann StartBackGroundProzess() auf?

Habe mit PacketSender.com überprüft, ob eine Antwort kommt. Vier Geräte senden eine passende Antwort, die ich alle auswerten muss. Also liegts doch an meinem C# Code weil nichts ankommt.

R
212 Beiträge seit 2012
vor 10 Jahren

Kommen die antworten denn auf dem richtigen port an?

Schonmal mit einem snipper geschaut ob was richtiges ankommt.

Versuchmal dich mit einem TCPListener an den port zu hängen.

StartBackGroundProzess rufst du dann auf wenn du es für nötig hälst auf eine antwort zu warten(nach dem senden denke ich)

Da wo /DeinCode zum empfangen der nachricht/ steht schreibst du einfach den code zum empfangen der nachricht rein sowas wie udpClient.Receive(ref RemoteIpEndPoint);(du solltest den UdpClient natürlich der methode übergeben damit dieser die zur verfügung steht)