Autore Topic: Come ottenere la netmask della interfaccia attiva ?  (Letto 981 volte)

Offline dany_andy

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer
  • Sistema operativo:
    Windows 7
Come ottenere la netmask della interfaccia attiva ?
« il: 12 Novembre 2011, 23:42:20 CET »
0
Ciao, avrei bisogno di ricavare la netmask indipendentemente da che si sia connessi via wifi che in 3G, in rete l'unico modo che ho trovato e' appongiandosi alla classe InterfaceAddress che non e' presente nella libreria android-8.

Vorrei evitare di eseguire una connessione 3G solo per ottenere l'informazione, qualcuno ha un suggerimento ?


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Come ottenere la netmask della interfaccia attiva ?
« Risposta #1 il: 13 Novembre 2011, 09:15:04 CET »
0
Puoi utilizzare la classe Runtime per eseguire il comando "netcfg" e esaminare output. Il comando riporta per ogni interfaccia di comunicazione la netmask (non esiste una globale indipendente, ogni interfaccia ha la sua).
adb logcat | tee /tmp/logcat | grep TAG

Offline dany_andy

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer
  • Sistema operativo:
    Windows 7
Re:Come ottenere la netmask della interfaccia attiva ?
« Risposta #2 il: 13 Novembre 2011, 11:26:13 CET »
0
Grazie iceweasel,
Una ottima via di uscita, in generale non amo fare system.exec, ma se non trovo una strada java pura non avro' altra scelta.
Sto valutando se la classe ConnectivityManager puo' venirmi incontro, la mia esigenza e' stabilire se un dato IP appartiene alla stessa subnet del device o no.

ciao
dany

Offline crashboom

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
Re:Come ottenere la netmask della interfaccia attiva ?
« Risposta #3 il: 22 Novembre 2011, 00:18:18 CET »
0

Per il wifi conviene usare il WifiManager, o la classe WifiInfo che ti permette di prendere info sulla connessione attiva .
Bisogna però stare attenti hai permessi.

Offline dany_andy

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer
  • Sistema operativo:
    Windows 7
Re:Come ottenere la netmask della interfaccia attiva ?
« Risposta #4 il: 29 Novembre 2011, 11:45:23 CET »
0
Grazie a tutti, alla fine non ho trovato alternativa alla system.exec, e il buon vecchio linux con il comando "ip neighbour show", ma vista la durata ho utilizzato un thread a parte.

Vi allego la bozza del codice, e' ancora da ripulire e consolidare (syncronize, try catch, throw, exception, commenti ecc... )

PS: Anche per il networking (calcolo subnet, broadcast ecc..) alla fine mi sono fatto una classe ad hoc, ho trovato qualche cosa in rete (apache) ma per le cose semplici che mi servivano ho preferito farle.

Sono piu' che ben accetti commenti e osservazioni.

Codice (Java): [Seleziona]
/**
 *
 */

package danyandy.util.network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.util.Log;

/**
 * @author daniele
 *
 */

public class ArpTable {
        private static final String LOG_TAG = "Arp";
        private List<ArpEntry> entry = new ArrayList<ArpEntry>();
       
        public ArpTable() {
                reloadTable();
        }
        public void Flush(String dev) {
                String cmd = "ip neighbour flush dev "+ dev;
        try {  
            Process p = Runtime.getRuntime().exec(cmd);  
                  Log.d(LOG_TAG, "[" + p.exitValue() + "]" + cmd);
        } catch (IOException e) {  
            e.printStackTrace();
        }
        }
        public void Refresh() {
               
        }
        public String toString() {
                return entry.toString();
        }
        public List<ArpEntry> getArpTable() {
                return entry;
        }
        public ArpEntry getByAddress(InetAddress ip) {
                ArpEntry e;
                Iterator<ArpEntry> i = entry.listIterator();
                while(i.hasNext()) {
                        e = i.next();
                        if(e.getIpAddress().equals(ip)) return e;
                }
                return null;
        }
        public ArpEntry getByAddress(String ip) throws UnknownHostException {
                ArpEntry e;
                InetAddress tempIP = (InetAddress)InetAddress.getByName(ip);
                Iterator<ArpEntry> i = entry.listIterator();
                while(i.hasNext()) {
                        e = i.next();
                        if(e.getIpAddress().equals(tempIP)) return e;
                }
                return null;
        }
        protected int reloadTable() {
                int pending = 0;
                entry.clear();
                try {  
            Process p = Runtime.getRuntime().exec("ip neighbour show");
            Thread.yield();
            BufferedReader in = new BufferedReader(  
                                new InputStreamReader(p.getInputStream()));  
            String line = null;  
            ArpEntry el;
            while ((line = in.readLine()) != null) {
                  el = new ArpEntry(line);
                  if(el.isStale() || el.isReachable() ) {
                          entry.add(el);
                          Log.d(LOG_TAG, line);
                  }
                  if(el.isPending()) pending++;
            }  
        } catch (IOException e) {  
            e.printStackTrace();
        }
                return pending;
       
        }
        /*
        public void ArpDiscovery(InetAddress ip, InetAddress nm) throws SocketException {
                InetAddress srcnet = danyandy.util.network.Subnet.getNetwork(ip,nm);
                InetAddress srcbrd = danyandy.util.network.Subnet.getBroadcast(ip,nm);
                InetAddress x;
                int ni = danyandy.util.network.Subnet.byteArrayToInt(srcnet.getAddress(),0);
                int si = danyandy.util.network.Subnet.byteArrayToInt(srcbrd.getAddress(),0);
                for(int i = ni, slow = 0;i!=si;i++,slow++) {
                        try {
                                x = InetAddress.getByAddress(BigInteger.valueOf(i).toByteArray());
                        DatagramSocket socket = new DatagramSocket();
                        DatagramPacket packet = new DatagramPacket(new byte[6],6,x,9);
                        try {
                                socket.send(packet);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        socket.close();                
                        } catch (UnknownHostException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                        }
                        Thread.yield();
                        if(slow > 10) {
                                slow = 0;
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                }
                Thread.yield();
                try {
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }      
                reloadTable();
        }
        */

}

E un Thread per la discovery

Codice (Java): [Seleziona]
/**
 *
 */

package danyandy.util.network;

import java.io.IOException;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * @author daniele
 *
 */

public class ArpDiscovery extends ArpTable implements Runnable  {
        private int ni;
        private int si;
        private int status;
        private int current;
        public final int ARP_REQUEST_SEND = 0;
        public final int ARP_RESPONSE_WAIT = 1;
       
        public  ArpDiscovery(InetAddress ip, InetAddress nm) throws SocketException {
                InetAddress srcnet = danyandy.util.network.Subnet.getNetwork(ip,nm);
                InetAddress srcbrd = danyandy.util.network.Subnet.getBroadcast(ip,nm);
                ni = danyandy.util.network.Subnet.byteArrayToInt(srcnet.getAddress(),0);
                si = danyandy.util.network.Subnet.byteArrayToInt(srcbrd.getAddress(),0);
        }

        public int getProgress() {
                return(current - ni);
        }
        public int getMaxHosts() {
                return(si-ni);
        }
        public int getStatus() {
                return(status);
        }
       
        /* (non-Javadoc)
         * @see java.lang.Runnable#run()
         */

        public void run() {
                // TODO Auto-generated method stub
                InetAddress x;
                int slow;
                status = ARP_REQUEST_SEND;
                for(current = ni, slow = 0;current!=si;current ++,slow++) {
                        try {
                                x = InetAddress.getByAddress(BigInteger.valueOf(current).toByteArray());
                        DatagramSocket socket = new DatagramSocket();
                        DatagramPacket packet = new DatagramPacket(new byte[6],6,x,9);
                        try {
                                socket.send(packet);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        socket.close();                
                        } catch (UnknownHostException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                        } catch (SocketException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        Thread.yield();
                        if(slow > 10) {
                                slow = 0;
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                }
                Thread.yield();
                try {
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }      
                status = ARP_RESPONSE_WAIT;
        int pending = 0;
        for(int limit = 0;limit < 1000 && pending > 0; limit++) {
                pending = reloadTable();
                current = ni - pending;
                }
               
        }

}