Как убедиться, что система подключена через локальную сеть? - PullRequest
3 голосов
/ 01 апреля 2012

В моем приложении Swing (с Web-Start) мне нужно вручную вводить IP-адреса машин, которым я хочу предоставить доступ к приложению, теперь во время ввода IP-адресов я хочу проверить, что машина Введенный мной IP-адрес подключен к моей машине (, действующий как локальный сервер ) только через локальную сеть (через коммутатор, а не маршрутизатор) или нет. Потому что, если машина не находится в локальной сети, ей не следует разрешать доступ к приложению.

Как мне этого добиться?

Ответы [ 2 ]

4 голосов
/ 01 апреля 2012

Насколько я понимаю вашу проблему, вам нужно проверить, находится ли конкретный IP-адрес, введенный в вашем приложении, в напрямую подключенной сети для клиентского хоста.

Если это так, тогда используйте обычный ping won 'Это работает для вас, так как пинг будет включать маршрутизацию пакетов.Таким образом, даже хосты за маршрутизаторами ответят.

В качестве обходного пути вы можете добавить параметр «-t 1» в ping, указав TTL для пакетов ICMP, чтобы они не могли проходить через маршрутизатор.

Или посмотрите следующий пример, если вы хотите, чтобы что-то подобное реализовано в Java (вы должны принять это для своих нужд):

public class IsAddressDirectlyConnected {

    private static class Network {
        int network;
        int mask;

        Network(int n, int m) {
            network = n;
            mask = m;
        }
    };

    // list of networks on interfaces of machine this code is being run on
    List<Network> mDirectlyAttachedNetworks = new ArrayList<Network>();

    private int addrBytesToInt(byte[] addr) {
        int addri = 0;
        for (int i = 0; i < addr.length; ++i)
            addri = (addri << 8) | ((int)addr[i] & 0xFF);        
        return addri;
    }

    private void collectLocalAddresses() {
        try {
            Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();

            while (nifs.hasMoreElements()) {
                NetworkInterface nif = nifs.nextElement();
                if (nif.isUp()) {
                    List<InterfaceAddress> ias = nif.getInterfaceAddresses();
                    for (InterfaceAddress ia : ias) {
                        InetAddress ina = ia.getAddress();
                        if (ina instanceof Inet4Address) {
                            int addri = addrBytesToInt(ina.getAddress());
                            int mask = -1 << (32 - ia.getNetworkPrefixLength());
                            addri &= mask;
                            mDirectlyAttachedNetworks.add(new Network(addri, mask));
                        }
                    }
                }
            }
        } catch (SocketException ex) {
            System.err.println("Socket i/o error: " + ex.getLocalizedMessage());
        }
    }

    public boolean isDirectlyAttachedAndReachable(InetAddress address) {
        int checkedAddr = addrBytesToInt(address.getAddress());
        try {
            if (!address.isReachable(1000))
                return false;
        } catch (IOException ex) {
            System.err.println("Failed to check reachability: " + ex.getLocalizedMessage());
            return false;
        }

        for (Network n : mDirectlyAttachedNetworks) {
            if ((checkedAddr & n.mask) == n.network)
                return true;
        }
        return false;
    }

    public IsAddressDirectlyConnected() {
        collectLocalAddresses();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        IsAddressDirectlyConnected iadc = new IsAddressDirectlyConnected();

        if (args.length == 1) {
            try {
                boolean check = iadc.isDirectlyAttachedAndReachable(Inet4Address.getByName(args[0]));
                System.out.println("Given IP is " + (check ? "" : "not ") + "on directly attached network " + (check ? "and " : "or not ")  + "reachable from local host.");
            } catch (UnknownHostException ex) {
                System.err.println("Failed to parse address: " + ex.getLocalizedMessage());
            }
        } else System.out.println("Specify address to check.");
    }
}
3 голосов
/ 01 апреля 2012

Просто пинг по этому адресу

Process p = Runtime.getRuntime().exec("ping " + your_ip_address);

BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...