Avatar billede DonSkoD Juniormester
09. maj 2014 - 10:17 Der er 6 kommentarer og
1 løsning

Java - loop som tjekker IP-adresser og stopper ved speciel.

Hej

Jeg forsøger at lave et program, som skal tjekke om brugeren er på ét ud af 2 netværk, hvorefter den skal stoppe og sætte en tekst i et textarea.

Jeg har fundet følgende post, som meget godt beskriver hvad jeg ønsker (jeg skal bare udelukkende bruge IP adresserne fra PC'ens interfaces):
http://docs.oracle.com/javase/tutorial/networking/nifs/listing.html

Hvis IP'en ligger i ét af følgende netværk 172.16.0.0/24 eller 10.10.0.0/24, skal den bare slutte loop og udføre textarea.setText("klar...").
Avatar billede arne_v Ekspert
10. maj 2014 - 04:50 #1
Kun minimalt testet:

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.Enumeration;

public class IPMatch {
    private static int bytes2int(byte[] b) throws IOException {
        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(b));
        return dis.readInt();
    }
    private static boolean check(int addr, int bits) throws IOException {
        int mask = -1 << (32 - bits);
        Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface nic : Collections.list(nics)) {
            Enumeration<InetAddress> nicaddrs = nic.getInetAddresses();
            for (InetAddress nicaddr : Collections.list(nicaddrs)) {
                int a = bytes2int(nicaddr.getAddress());
                if((a & mask) == (addr & mask)) {
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean check(String val) throws IOException {
        String[] valparts = val.split("/");
        String[] addrparts = valparts[0].split("\\.");
        byte[] bytaddr = new byte[4];
        for(int i = 0; i < 4; i++) {
            bytaddr[i] = (byte)Short.parseShort(addrparts[i]);
        }
        int addr = bytes2int(bytaddr);
        int bits = Integer.parseInt(valparts[1]);
        return check(addr, bits);
    }
    public static void main(String[] args) throws Exception {
        System.out.println(check("172.16.0.0/24"));
        System.out.println(check("10.10.0.0/24"));
        System.out.println(check("192.168.0.0/24"));
    }
}
Avatar billede DonSkoD Juniormester
12. maj 2014 - 10:30 #2
Kan man ikke benytte det linkede eksempel med en smule regex-kode, som siger at hvis IP'en starter på 172.16 eller 10.10, så er den "OK"?

Jeg prøver lige dit eksempel her senere i dag.

private void formWindowOpened(java.awt.event.WindowEvent evt) {
  try {
      Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
      for (NetworkInterface netint : Collections.list(nets))
        displayInterfaceInformation(netint);
  } catch (SocketException e){
  }
}
static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
  Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
  for (InetAddress inetAddress : Collections.list(inetAddresses)) {
      if (inetAddress == (regex-kode)) {
        statusarea.settext("Klar...");
        }
      }
  }
Avatar billede arne_v Ekspert
12. maj 2014 - 20:14 #3
Du kan lave:

import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.Enumeration;

public class IPMatch2 {
    private static boolean check(String val) throws IOException {
        Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface nic : Collections.list(nics)) {
            Enumeration<InetAddress> nicaddrs = nic.getInetAddresses();
            for (InetAddress nicaddr : Collections.list(nicaddrs)) {
                if(nicaddr.toString().substring(1).startsWith(val)) {
                    return true;
                }
            }
        }
        return false;
    }
    public static void main(String[] args) throws Exception {
        System.out.println(check("172.16.0"));
        System.out.println(check("10.10.0"));
        System.out.println(check("192.168.0"));
    }
}
Avatar billede arne_v Ekspert
12. maj 2014 - 20:15 #4
Men den virker jo kun med 8, 16 og 24 !
Avatar billede DonSkoD Juniormester
13. maj 2014 - 14:58 #5
Tak for det - det ser ud til at være det, som jeg skal bruge.

Det er ikke så vigtigt med præcist subnet - programmet bliver kun brugt lokalt her hos os, så det skal bare kunne tjekke om det bliver kørt fra LAN (172.16.x.x) eller WLAN (10.10.x.x).

Smid et svar :)
Avatar billede arne_v Ekspert
13. maj 2014 - 15:01 #6
svar
Avatar billede arne_v Ekspert
13. maj 2014 - 15:01 #7
Pas ioevrigt paa med IPv6 - mange ting er anderledes.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester