# UDP Broadcast



## JimmyJo1987 (14. Aug 2011)

Hallo zusammen 

ich versuche gerade im lokalen Netzwerk ein bestimmtes Gerät zu finden. Dazu schicke ich einen bestimmten Code an die Broadcast Adresse. Daraufhin Antwortet das Gerät.
Bin im moment soweit, dass das Paket geschickt wird und das Gerät auch Antwortet (laut Wireshark netzwerk analyse)
Beim empfangen hängt er sich jedoch bei receive auf. Warum auch immer vielleicht hat jemand von euch ja einen 
Vorschlag.

Vielen Dank

[Java]
DatagramSocket clientSocket = new DatagramSocket();
			IPAddress = InetAddress.getByName("192.168.1.255");
			String mee;
			mee="Code";
			byte[] sendData = new byte[256];	
			sendData=mee.getBytes();
			DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 8001);
			clientSocket.send(sendPacket);

			clientSocket.close();


			DatagramSocket serverSocket = new DatagramSocket(8001);
			byte[] receiveData = new byte[256];
			DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            //InetAddress IPAddress1 = receivePacket.getAddress();

[/Java]


----------



## dayaftereh (14. Aug 2011)

Hey, also der Code ist so weit inordnung.. Bist du dir sich, dass das gerät auf den Port 8001 antwortet. Also wenn du recive aufrufst dann hängt der ausführen so lannge bist Daten auf dem Socket ankommen!Daher denke ich das keine Daten auf dem UDP Port 8001 ankommen!


----------



## JimmyJo1987 (15. Aug 2011)

Danke erstmal für deine Antwort.
Kann es sein, dass das Telegramm beim senden so schnell Antwortet das es der receiver nicht mehr mitbekommt?
Da ich definitiv ein Telegramm zurück erhalte.
Das nächste Thema wäre dann, wie kann ich das abbrechen? Da es ja sein könnte, dass kein Gerät zum Antworten da ist.


----------



## dayaftereh (15. Aug 2011)

Das könnte gut sein! Mach einfach mal den ServerSocket vor dem Senden Auf?


----------



## JimmyJo1987 (15. Aug 2011)

Ja gut,
aber dann hängt es ja erst recht wenn er auf eine Antwort wartet.
Da die Anfrage ja erst danach versendet werden würde, oder versteh ich was falsch?


----------



## c_sidi90 (15. Aug 2011)

Wieso hängt der dann erstrecht? Starte den ServerSocket in einem Thread und lasse ihn dauerhaft auf dem bestimmten Port lauschen und lege ihn für ein paar ms schlafen.

P.S ich würde das receive und send in einen Try-Catch block setzen um mögliche exceptions abzufangen und gegebenfalls die message ausgeben lassen. 

LG


----------



## dayaftereh (15. Aug 2011)

Hey, versuche das mal:

```
DatagramSocket serverSocket = new DatagramSocket(8001);

DatagramSocket clientSocket = new DatagramSocket();
IPAddress = InetAddress.getByName("192.168.1.255");           
byte[] sendData = new byte[256];
sendData="Code".getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 8001);
clientSocket.send(sendPacket);        
            
byte[] receiveData = new byte[256];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
```

Also der ServerSocket ist jetzt offen und Buffered alle eingehenden Daten sollange bis du receive Aufrufst!


----------



## JimmyJo1987 (15. Aug 2011)

Aso in einem separaten Thread, ok daran habe ich nicht gedacht. 
Werde das direkt mal versuchen.


----------



## dayaftereh (15. Aug 2011)

Musst dann mit Join auf das ende des Threads warten!


----------



## JimmyJo1987 (15. Aug 2011)

Hey hab das nun mal versucht so wie du es mir gepostet hast,
nur sagt er mir jetzt bei der Broadcast Adresse:

Address is already in use can not bind


----------



## Dit_ (15. Aug 2011)

hatte mal so ähnliches Problem. Habe as mit einer Sendepause von 300ms(sleep()) gelöst. also senden,empfangen,pause,senden,empgangen, pause...


----------



## dayaftereh (15. Aug 2011)

Hey, also bei mir Klappt es, schau mal mein Code an. Ich nutze nur ein Socket.

```
DatagramSocket socket = new DatagramSocket();
				
InetSocketAddress a = new InetSocketAddress("localhost", 10100);
byte[] buf = "Hallo".getBytes();
DatagramPacket p = new DatagramPacket(buf, buf.length, a);
socket.send(p);
						
buf = new byte[256];
DatagramPacket p2 = new DatagramPacket(buf, buf.length);
socket.receive(p2);
```


----------



## JimmJo1987 (16. Aug 2011)

Hey,
*herzlichen Dank an alle!!!* nun klappt es soweit. Nur kann es auch sein, dass ich zum Beispiel zwei Geräte
habe die sich melden.
Mache ich nun zweimal receive und es ist nur ein Gerät da hängt er wieder.
Mache ich nur einmal receive kann es sein das eventuell andere Geräte übergangen werden.

Kann man abfragen ob noch was zum empfangen bereit ist?


----------



## JimmyJo198 (16. Aug 2011)

JimmJo1987 hat gesagt.:


> Hey,
> *herzlichen Dank an alle!!!* nun klappt es soweit. Nur kann es auch sein, dass ich zum Beispiel zwei Geräte
> habe die sich melden.
> Mache ich nun zweimal receive und es ist nur ein Gerät da hängt er wieder.
> ...



Habe Es jetzt mal vorher mit getLength() versucht Scheint zu gehen leider nur ein Testgerät da!


```
while (p2.getLength()==1024)
	{
	socket.receive(p2);
	JOptionPane.showMessageDialog(null, p2.getAddress());
					
}
```


----------



## dayaftereh (17. Aug 2011)

Also eigentlich erzeugt man eine Thread der in einer Schleife läuft und die ganze zeit schau ob daten reihn kommen, wenn ja dann die daten vom socket lesen und dann wider auf daten warten! DIe eingelesenen daten können dann entweder direkt vom Thread verarbeitet werden oder man über gibt sie an einen anderen Thread(oder ThreadPool) der dann die daten weiter verarbeitet.


----------

