/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) version 3. ** ** Filius is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ** PURPOSE. See the GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.software.vermittlungsschicht; import java.util.StringTokenizer; import java.util.ListIterator; import filius.Main; import filius.software.Protokoll; import filius.software.system.SystemSoftware; import filius.hardware.knoten.InternetKnoten; import filius.hardware.NetzwerkInterface; /** Oberklasse von ARP und IP mit Hilfsmethoden */ public abstract class VermittlungsProtokoll extends Protokoll { /** Standard-Konstruktor der Oberklasse Protokoll */ public VermittlungsProtokoll(SystemSoftware systemSoftware) { super(systemSoftware); Main.debug.println("INVOKED-2 ("+this.hashCode()+") "+getClass()+" (VermittlungsProtokoll), constr: VermittlungsProtokoll("+systemSoftware+")"); } /** * Methode zum pruefen, ob sich zwei IP-Adressen im gleichen Rechnernetz * befinden. Dazu wird die Netzmaske benoetigt: * <ol> * <li> Bitweise ODER-Verknuepfung der ersten IP-Adresse und der Netzmaske * </li> * <li> Bitweise ODER-Verknuepfung der zweiten IP-Adresse und der Netzmaske * </li> * <li> Vergleich der zwei Netz-IDs, die in den vorangegangenen Schritten * berechnet wurden </li> * </ol> * * @param adresseEins * erste IP-Adresse als String * @param adresseZwei * zweite IP-Adresse als String * @param netzmaske * Netzmaske als String * @return ob die Netz-IDs der zwei Adressen uebereinstimmen */ public static boolean gleichesRechnernetz(String adresseEins, String adresseZwei, String netzmaske) { Main.debug.println("INVOKED (static) filius.software.vermittlungsschicht.VermittlungsProtokoll, gleichesRechnernetz("+adresseEins+","+adresseZwei+","+netzmaske+")"); int[] a1, a2, m; StringTokenizer tokenizer; boolean gleichesRechnernetz = true; tokenizer = new StringTokenizer(adresseEins, "."); a1 = new int[4]; for (int i = 0; i < a1.length && tokenizer.hasMoreTokens(); i++) { a1[i] = Integer.parseInt(tokenizer.nextToken()); } tokenizer = new StringTokenizer(adresseZwei, "."); a2 = new int[4]; for (int i = 0; i < a2.length && tokenizer.hasMoreTokens(); i++) { a2[i] = Integer.parseInt(tokenizer.nextToken()); } tokenizer = new StringTokenizer(netzmaske, "."); m = new int[4]; for (int i = 0; i < m.length && tokenizer.hasMoreTokens(); i++) { m[i] = Integer.parseInt(tokenizer.nextToken()); } for (int i = 0; i < 4 && gleichesRechnernetz; i++) { if ((a1[i] & m[i]) == (a2[i] & m[i])) gleichesRechnernetz = true; else gleichesRechnernetz = false; } return gleichesRechnernetz; } public boolean isLocal(String ip) { if (gleichesRechnernetz(ip, "127.0.0.0", "255.0.0.0")) { return true; } InternetKnoten knoten = (InternetKnoten) holeSystemSoftware().getKnoten(); ListIterator it = knoten.getNetzwerkInterfaces().listIterator(); NetzwerkInterface nic; while (it.hasNext()) { nic = (NetzwerkInterface) it.next(); if (ip.equals(nic.getIp())) { return true; } } return false; } }