15 Stimmen

Das Senden von Paketen an 255.255.255.255 mit Java DatagramSocket schlägt fehl

Ich programmiere ein Netzwerkprogramm in Java, und ich möchte einige Pakete an 255.255.255.255 senden, aber es schlägt fehl, selbst wenn ich sie an 192.168.1.255 sende, was laut der Ausgabe des ifconfig-Befehls die Broadcast-Adresse ist. Aber wenn ich sie an die IP meines Freundes sende, funktioniert es gut.

Hier ist der Code für mein Programm:

public class StackOverFlow {
    public static void main(String[] args) {
        Network net= new Network();

        Scanner input= new Scanner(System.in);
        while(input.hasNext())
          net.sendMessage(input.nextLine());
    }
}

Ich habe DatagarmSocket und DatagramPacket verwendet, um dies zu tun, hier ist meine Implementierung des Netzwerks:

class Network {
DatagramSocket socket;

public Network() {
    try {
        socket = new DatagramSocket(8027);
        socket.connect(InetAddress.getByName("255.255.255.255"), 8027);
    } catch (Exception e) {
        System.err.println("Connection failed. " + e.getMessage());
    }
    listen();
}

public void listen() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    byte[] buf = new byte[1000];
                    DatagramPacket packet = new DatagramPacket(buf,
                            buf.length);
                    socket.receive(packet);
                    String message = new String(buf);
                    System.out.println("Recieved: " + message);
                    if (message.equals("end"))
                        return;
                } catch (Exception e) {
                    System.err.println(e.getMessage());
                }
            }
        }
    }.start();
}

public void sendMessage(String message){
    byte[] buf= message.getBytes();

    DatagramPacket packet= new DatagramPacket(buf, buf.length);
    try{
        socket.send(packet);
    }catch(Exception e){
        System.err.println("Sending failed. " + e.getMessage());
    }
}

Es werden keine Ausnahmen ausgelöst.
Ich bin in einem Ad-hoc-Netz.
Ich verwende MAC OS X 10.6, während mein Freund kubuntu 11.04 verwendet. Und hier ist die ifconfig-Ausgabe:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
inet 127.0.0.1 netmask 0xff000000 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::21f:f3ff:fed5:4779%en0 prefixlen 64 scopeid 0x4 
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:1f:f3:d5:47:79 
media: autoselect (100baseTX <full-duplex>) status: active
supported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP     <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half-    duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> none

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::21d:4fff:feff:2b4d%en1 prefixlen 64 scopeid 0x5 
inet 213.233.170.97 netmask 0xfffffc00 broadcast 213.233.171.255
ether 00:1d:4f:ff:2b:4d 
media: autoselect status: active
supported media: autoselect

fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030
lladdr 00:21:e9:ff:fe:bc:79:b2 
media: autoselect <full-duplex> status: inactive
supported media: autoselect <full-duplex>

en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:1f:f3:b6:2c:be 
media: autoselect status: inactive
supported media: none autoselect 10baseT/UTP <half-duplex>

vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.149.1 netmask 0xffffff00 broadcast 192.168.149.255
ether 00:50:56:c0:00:01 

vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.73.1 netmask 0xffffff00 broadcast 192.168.73.255
ether 00:50:56:c0:00:08 

en0 ist das Gerät, das ich für die Verbindung mit meinem Partner verwende.

Bitte machen Sie es einfach, ich bin ein Neuling :)

Vielen Dank im Voraus.

11voto

fyr Punkte 19599

Bei der Verwendung von Broadcasting müssen Sie es aktivieren

socket.setBroadcast(true);

Außerdem müssen Sie sicherstellen, dass Ihr Router richtig konfiguriert ist, wenn sich die beiden Computer in zwei verschiedenen Netzen befinden. Rundsendungen werden in der Regel nicht geroutet. Wenn Sie einen Router mit einer kabellosen und einer kabelgebundenen Schnittstelle haben, können diese Übertragungen auch nicht funktionieren, wenn die Übertragungen nicht aktiviert sind (es kann Hardware geben, die Übertragungen zwischen diesen beiden Schnittstellen standardmäßig weiterleitet).

6voto

captainroxors Punkte 61

Anstatt Ihren DatagramSocket mit der Broadcast-Adresse zu verbinden, konstruieren Sie einfach das DatagramPacket, um es zu erreichen, d.h.

DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length, InetAddress.getByName("255.255.255.255"), yourPortNumber);

Und wie von Zauberhand haben Sie eine Sendung verschickt. Und um es auf der anderen Seite abzufangen, müssen Sie die andere Seite nur auf diesem Port abhören lassen:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove);
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length);
dsock.receive(dp);

3voto

Kamahire Punkte 2099
192.168.1.255 
  • Bitte überprüfen Sie Ihre Subnetzmaske in Ihrem Netzwerk. Es kann sein, dass Ihr Sendegerät und das Empfangsgerät nicht zum selben Netzwerk gehören.
  • Bitte prüfen Sie, ob der Empfänger in Ihrem Netzwerk vorhanden ist.
  • Wenn sich zwischen Ihren Rechnern ein Router befindet, wird die Nachricht wohl nicht übertragen werden.

1voto

Volker Stolz Punkte 7045

Wenn ich mich richtig erinnere, Sie können nicht von Broadcast-Adressen empfangen , aber nur an sie senden! Auf der Empfängerseite müssen Sie also speziell auf "Ihrer" IP abhören.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X