2011-07-05 18 views
15

Estoy programando un programa de red en Java, y quiero enviar algunos paquetes a 255.255.255.255, pero falla, incluso cuando los envío a 192.168.1.255, que de acuerdo con la salida del comando ifconfig, es la dirección de difusión. Pero cuando los envío a la IP de mi compañero, funciona bien.Envío de paquetes a 255.255.255.255 por Java DatagramSocket falla

Aquí está el código para mi programa:

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

He usado DatagarmSocket y DatagramPacket para hacerlo, aquí está mi implementación de la Red:

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

están siendo lanzados sin excepciones.
Estoy en una red ad hoc.
Estoy usando MAC OS X 10.6 mientras mi compañero está usando kubuntu 11.04. Y aquí es resultado de 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 es el dispositivo que estoy usando para conectarse a mi compañero.

Por favor, que sea sencillo, soy un novato :)

Gracias de antemano.

+0

¡Por favor, muestre la salida de 'ifconfig'! – ShiDoiSi

+0

He extendido la publicación. –

Respuesta

10

Durante el uso de la radiodifusión que tenga que activarlo

socket.setBroadcast(true); 

Otra cosa es que usted tiene que asegurarse de que su router está configurado bien si los dos equipos están en dos redes diferentes. Por lo general, las transmisiones no se enrutan. Además, si tiene un enrutador que tenga una interfaz inalámbrica y una interfaz con cable, estas difusiones pueden no funcionar tampoco si las difusiones no están habilitadas (puede haber hardware que reenvía las transmisiones entre esas dos interfaces por defecto).

+0

He añadido socket.setBroadcast (true) justo después de socket.connect (...). Pero todavía no funciona. ¿Cuál es el problema? –

+0

Extiendo la publicación. – fyr

+0

Gracias. Pero no, no hay enrutador. Es una red ad hoc. Una computadora a computadora. Pero no funciona. ¿Cuál es la forma habitual de transmitir en la red? –

1

Si no recuerdo mal, you cannot receive from broadcast-adresses, pero solo envíelas! Por lo tanto, en el lado de recepción, debe estar escuchando en "su" IP específicamente.

+0

¿De verdad? Pero cómo ? Debería tener un DatagramSocket para enviar y otro DatagramSocket para recibir? ¿Y ambos en el mismo puerto? Creo que eso es imposible. (Creo que el sistema operativo no nos permitirá tener dos tomas con el mismo puerto) –

+0

@ Pro.Hessam, el remitente no tiene que usar un puerto en particular, cualquiera lo hará. – ShiDoiSi

+0

¿quiere decir que envío paquetes al puerto 8030 y los recibo desde 8027, por ejemplo? Hice un DatagramSocket conectado a 255.255.255.255 y un DatagramSocket conectado a localhost uno está utilizando el puerto 8030, otro está utilizando el puerto 8027. pero no está funcionando. ¿Cuál es el problema? –

2

192.168.1.255

  • Por favor, compruebe la máscara de subred de la red. Es posible que su máquina y la máquina no sean la misma red .
  • Compruebe que la máquina ya exista.
  • si enrutador, entonces no creo que el mensaje se transmita al destino.
+0

@Karnahire, en este momento. Estoy enviando paquetes a los míos. (enviando paquetes a "192.168.1.255"). Pero no puedo recibirlos. Pero cuando envío paquetes a "localhost" funciona bien. –

+0

La transmisión de la dirección IP 192.168.1.255 no funciona en el caso de Windows y Mac. No encontré por qué? – Kamahire

5

En lugar de conectar su DatagramSocket a la dirección de difusión, simplemente construir el DatagramPacket enfrentarse a ésta, es decir

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

Y al igual que la magia, que ha enviado una difusión. Y luego para atraparlo del otro lado, solo tiene que escuchar en ese puerto:

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