2010-06-07 8 views
8

Je crée une application Client Server pour mon téléphone Android.Adresse de diffusion Android

J'ai créé un serveur UDP dans Python qui se trouve et écoute les connexions.

Je peux mettre l'adresse du serveur IP directement comme 192.169.0.100 et il envoie des données bien. Je peux également mettre 192.168.0.255 et trouver le serveur sur 192.169.0.100.

Est-il possible d'obtenir l'adresse de diffusion du réseau auquel mon téléphone Android est connecté? Je vais seulement utiliser cette application sur mon réseau Wifi ou d'autres réseaux Wifi.

Vive

Répondre

1

Comme l'adresse IP de diffusion est l'adresse IP actuelle, mais la finition avec 255, vous pouvez faire quelque chose comme ceci:

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

C'est le fait (peut-être injustifiée) supposant que le masque de réseau est 255.255.255.255. Vous devriez réellement obtenir le masque de réseau associé à l'adresse que vous avez récupérée, puis calculer 'bcast = ipAddress | ~ netmask' – hobbs

+0

Je pensais que, comment mettriez-vous en œuvre une telle chose? Cheers – RailsSon

+9

"Comme l'adresse IP de diffusion est l'adresse IP actuelle, mais se terminant par 25" ... non. un réseau domestique typique a un addr bcast de 0,255, mais ce n'est pas vrai en général. –

6

Voici une méthode qui devrait fonctionner:

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

Ceci a l'avantage de ne regarder que WIFI. Je sais que OP a déclaré: "Je n'utiliserai cette application que sur mon réseau Wifi ou sur d'autres réseaux Wifi." mais cela vaut la peine de le mentionner au cas où quelqu'un d'autre aurait besoin d'une alternative non-wifi.

+0

et ... n'oubliez pas vos gens d'autorisation manifeste! ssimm

0

Une façon plus simple peut-être ...

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"; 
    } 
} 
Questions connexes