2010-06-07 17 views
8

Estoy haciendo una aplicación Client Server para mi teléfono Android.Android Broadcast Address

He creado un servidor UDP en Python que se sienta y escucha las conexiones.

Puedo poner la dirección del servidor IP directamente como 192.169.0.100 y envía datos bien. También puedo ponerlo en 192.168.0.255 y encontrar el servidor en 192.169.0.100.

¿Es posible obtener la dirección de transmisión de la red a la que está conectado mi teléfono Android? Solo voy a utilizar esta aplicación en mi red Wifi u otras redes Wifi.

Saludos

Respuesta

1

Como la dirección de difusión IP es la dirección IP actual, pero terminando con 255, se puede hacer algo como esto:

public String getLocalIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface 
       .getNetworkInterfaces(); en.hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
       InetAddress inetAddress = enumIpAddr.nextElement(); 
       if (!inetAddress.isLoopbackAddress()) { 
        return inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } catch (SocketException ex) {} 
    return null; 
} 

public static String getBroadcast() throws SocketException { 
    System.setProperty("java.net.preferIPv4Stack", "true"); 
    for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); niEnum.hasMoreElements();) { 
     NetworkInterface ni = niEnum.nextElement(); 
     if (!ni.isLoopback()) { 
      for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) { 
       return interfaceAddress.getBroadcast().toString().substring(1); 
      } 
     } 
    } 
    return null; 
} 
+4

que está haciendo la suposición (posiblemente injustificada) que la máscara de red es 255.255.255.255. En realidad, debería obtener la máscara de red asociada con la dirección que recuperó, y luego calcular 'bcast = ipAddress | ~ netmask' – hobbs

+0

Estaba pensando que, ¿cómo implementarías tal cosa? Cheers – RailsSon

+9

"Como la dirección IP de difusión es la dirección IP actual pero termina con 25" ... no. una red doméstica típica tiene un addr bcast de .255, pero eso no es cierto en general. –

6

Aquí es un método que debería funcionar:

public static String getBroadcast(){ 
    String found_bcast_address=null; 
    System.setProperty("java.net.preferIPv4Stack", "true"); 
     try 
     { 
      Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); 
      while (niEnum.hasMoreElements()) 
      { 
      NetworkInterface ni = niEnum.nextElement(); 
      if(!ni.isLoopback()){ 
       for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) 
       { 

        found_bcast_address = interfaceAddress.getBroadcast().toString(); 
        found_bcast_address = found_bcast_address.substring(1); 

       } 
      } 
      } 
     } 
     catch (SocketException e) 
     { 
      e.printStackTrace(); 
     } 

     return found_bcast_address; 
} 
13

De

http://code.google.com/p/boxeeremote/source/browse/trunk/Boxee+Remote/src/com/andrewchatham/Discoverer.java?spec=svn28&r=28

private InetAddress getBroadcastAddress() throws IOException { 
    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow 

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
    byte[] quads = new byte[4]; 
    for (int k = 0; k < 4; k++) 
     quads[k] = (byte) (broadcast >> (k * 8)); 
    return InetAddress.getByAddress(quads); 
} 

Esto tiene la ventaja de solo mirar WIFI. Sé que OP dijo "Solo voy a utilizar esta aplicación en mi red WiFi u otras redes WiFi". pero vale la pena mencionar esto en caso de que alguien más necesite una alternativa que no sea wifi.

+0

y ... ¡no olvide su permiso de manifestación amigos! ssimm

0

Una manera más simple quizás ...

public static String getBroadcast() throws Exception { 
    System.setProperty("java.net.preferIPv4Stack", "true"); 
    InetAddress inet = InetAddress.getLocalHost(); 
    NetworkInterface net = NetworkInterface.getByInetAddress(inet); 
    InterfaceAddress [] interfaceAddresses = net.getInterfaceAddresses().toArray(new InterfaceAddress[0]); 
    if (interfaceAddresses.length > 0) { 
     return interfaceAddresses[0].getBroadcast().toString().substring(1); 
    } else { 
     return "255.255.255"; 
    } 
} 
Cuestiones relacionadas