# UDP Broadcasts: Wie funktionieren sie wirklich?



## Michael P (10. Sep 2005)

Hi,

Ich möchte zu Übungszwecken ein Chat-Programm für das LAN entwickeln. Der Benutzer soll am Anfang gefragt werden, auf welchen Netzwerkinterfaces das Programm laufen soll.


```
public static void showDevices() throws UnknownHostException
    {
        InetAddress[] ia = InetAddress.getAllByName(
                InetAddress.getLocalHost().getHostName());
        System.out.println(ia.length+" local devices available:");
        for(int i=0; i<ia.length; i++) {
            System.out.println("  " + ia[i].getHostAddress());
            //broadcast-adresse für ia[i] ermitteln... ?
        }
    }
```

Ich brauch nicht umbedingt die Broadcast-Adresse, es genügt auch die Subnet-Mask  . Ich weiß schon, wie man an diese Informationen rankommt, aber ich weiß nicht, wie man aus Java an diese Informationen rankommt. Nach langem googlen hab ich auch keine Infos dazu gefunden.

Eine Idee hab ich schon, wie man das Problem vielleicht lösen könnte. Was passiert eigentlich, wenn ich ein Paket an eine Broadcast-Adresse schicke, aber dem DatagramSocket vorher mit setBroadcast(false) gesagt habe, dass das nicht geht. Wird dann eine Exception geworfen? Wenn ja, dann probiere ich einfach alle Möglichkeiten für die Broadcase-Adresse durch (es sind glaub ich 19) und sende jeweils ein kleines Paket Daten. :shock: Hoffentlich gibt es eine Alternative...

Irgendwo hab ich gelesen, dass Linux keine Broadcast-Pakete empfängt, die an 255.255.255.255 adressiert sind. Weiß jemand etwas darüber?

Wenn ich ein Paket empfange, wie kann ich herausfinden, über welches Interface es hereingekommen ist? Geht das überhaupt mit Java?

mfg,
Michael


----------



## Bleiglanz (12. Sep 2005)

du meinst wohl eher

java.net.NetworkInterface#getNetworkInterfaces() 

und dann für jedes NetworkInterface

getInetAddresses() 

aufrufen



auch

java.net.MulticastSocket

berücksichtigen!


----------



## Michael P (13. Sep 2005)

Hi Bleiglanz!

Die Sache mit dem NetworkInterface ist zwar eleganter als diese RDNS/DNS-Kombination von mir, aber sie bringt mich meiner ursprünglichen Absicht, die Broadcast-Adresse herauszufinden leider nicht näher. Eine einfache Methode wie getSubnetMask() oder getBroadcastAddress() würde schon ausreichen. Ich habe den Verdacht, dass es sowas in Java garnicht gibt.

???:L

Multicasts kann ich nicht brauchen, weil ich mit meinem Programm ins Netzwerk hinausschreien will "hier bin ich", so wie das auch viele Netzwerkspiele tun (oder auch Netbios a.k.a. Windows Netzwerkumgebung); ein Broadcast sollte doch eigentlich keine Hexerei sein. Klar kann ich auch 255.255.255.255 nehmen, aber dann sende ich automatisch über alle Interfaces raus.

mfg,
Michael


----------



## Bleiglanz (14. Sep 2005)

hmm, glaub ich auch dass das nicht geht; aber mit 

```
address = InetAddress.getByName(); // meine?
        socket = new MulticastSocket();
        socket.joinGroup(address);
        // irgendwas zammenbauen
        socket.send(eindatenpaket);
```
sollte das doch hinhauen, auch ohne dass man die Subnetzmaske kennt?


----------



## Michael P (14. Sep 2005)

Hi,

danke erstmal. ich werd das dann nächste woche vielleicht ausprobieren. hab diese woche leider keine zeit mehr dafür weil ich nächste woche abschlussprüfung in meiner schule habe (Spezialthema "Netzwerkprogrammierung mit Java")  und meine Zeit immer knapper wird. ich muss jetzt erstmal die doku zu dem, was ich schon gemacht habe, fertigschreiben und falls ich dann noch zeit haben sollte (was ich nicht glaube), kümmer ich mich um die brot (oder multi) casts

 :### 

mfg,
Michael


----------

