Отправка пакетов на 255.255.255.255 с помощью Java DatagramSocket завершается неудачно - PullRequest
15 голосов
/ 05 июля 2011

Я программирую сетевую программу на Java, и я хочу отправить некоторые Пакеты на 255.255.255.255, но это не получается, даже когда я отправляю их на 192.168.1.255, который согласно выводу команды ifconfig являетсяшироковещательный адрес.Но когда я отправляю их на IP моего помощника, он работает нормально.

Вот код моей программы:

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());
    }
}

Я использовал для этого DatagarmSocket и DatagramPacket, вот моя реализация Сети:

class Network {
DatagramSocket socket;

public Network() {
    try {
        socket = new DatagramSocket(8027);
        socket.setBroadcast(true);
        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());
    }
}

НетВозникают исключения.
Я нахожусь в специальной сети.
Я использую MAC OS X 10.6, в то время как мой товарищ использует kubuntu 11.04.А вот вывод ifconfig:

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 - это устройство, которое я использую для подключения к моей подруге.

Пожалуйста, сделайте это проще, я новичок :)

Заранее спасибо.

Ответы [ 4 ]

11 голосов
/ 05 июля 2011

При использовании вещания необходимо включить его

socket.setBroadcast(true);

Другое дело, что вы должны убедиться, что ваш маршрутизатор настроен правильно, если два компьютера находятся в двух разных сетях. Трансляции обычно по умолчанию не маршрутизируются. Кроме того, если у вас есть маршрутизатор с беспроводным интерфейсом и проводным интерфейсом, эти широковещательные сообщения также могут не работать, если широковещательные сообщения не включены (может быть оборудование, которое по умолчанию передает широковещательные сообщения между этими двумя интерфейсами).

5 голосов
/ 10 января 2013

Вместо того, чтобы подключать ваш DatagramSocket к широковещательному адресу, просто создайте DatagramPacket для его назначения, т.е.

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

И, как по волшебству, вы отправили трансляцию. А затем, чтобы поймать его с другой стороны, просто прослушайте этот порт на этом порту:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove);
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length);
dsock.receive(dp);
3 голосов
/ 05 июля 2011
192.168.1.255 
  • Пожалуйста, проверьте маску своей подсети в сети. Возможно, что отправляющее и принимающее устройства не являются частью одной сети.
  • Пожалуйста, убедитесь, что принимающий аппарат существует в вашей сети.
  • Если между вашими компьютерами есть маршрутизатор, я не думаю, что сообщение будет передано.
1 голос
/ 05 июля 2011

Если я правильно помню, вы не можете получать с широковещательных адресов , а только отправлять им! Таким образом, на принимающей стороне вы должны слушать «ваш» IP-адрес.

...