munz Subnetting Version 0 – Munz FTE1- JAVA Programm Analyse import import import import import import import import import java.applet.Applet; java.awt.*; javax.swing.*; java.awt.event.*; java.io.*; java.lang.*; java.net.*; java.util.StringTokenizer; java.math.*; public class SubCalc extends Applet implements ItemListener, ActionListener { JTextArea taResult; JTextField tfIP; Choice chNWBits, chSNBits; Checkbox cbZeroSN; Button calcButton; int iNWBits = 0, iSNBits = 0, iDefaultNWBits = 24; boolean bDefaultZeroSN = true; final static String sVersion = "0"; // Applet Initialisierung public void init() { setBackground(Color.white); chNWBits = new Choice(); chSNBits = new Choice(); taResult = new JTextArea("", 24, 80); taResult.setFont(new Font("Courier", Font.PLAIN, 12)); taResult.setText(getSplashText()); D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 1 munz for (int i = 0; i <= 32; i++) { chNWBits.addItem("" + i); chSNBits.addItem("" + i); } if (iDefaultNWBits > 0 && iDefaultNWBits <= 32) { chNWBits.select(iNWBits = iDefaultNWBits); } //Layout fest legen(new GridLayout(4)); add(tfIP = new JTextField("127.0.0.1", 18)); add(new Label("NW Bits")); add(chNWBits); chNWBits.addItemListener(this); add(new Label("SN Bits")); add(chSNBits); chSNBits.addItemListener(this); add(cbZeroSN = new Checkbox("Zero Subnetz", bDefaultZeroSN)); add(calcButton = new Button("Berechnen")); calcButton.addActionListener(this); add("South", taResult); } public String getAppletInfo() { String info = "Los geht's"; return info; } public void start() { //panel.start(); } public void stop() { //panel.stop(); } public void destroy() { //remove(panel); //remove(controls); } private static String getSplashText() { return "Los geht's " ; } // integer in 'bit' string private static String o2b(int i) { return Integer.toBinaryString(i); } // integer in 'bit' string mit gegebener minimaler Länge private static String o2b(int i, int len) { D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 2 munz String bits = o2b(i); // führende Nullen addieren while (bits.length() < len) bits = "0" + bits; return bits; } // 8-Bit Wandlung in einen Hexadezimal String private static String b2h(String sBits) { String res = Integer.toHexString(b2o(sBits)); return 2 == res.length() ? res : "0" + res; } // Umwandlung 'bit' string nach integer private static int b2o(String sBits) { int i; try { i = Integer.parseInt(sBits, 2); } catch (Exception e) { i = 0; } } return i; // Subnetz Maske: Netzwerk und Subnetz bits 1, host bits 0 private static String getNetmaskStr(int iNW, int iSN) { String res = ""; int n = iNW + iSN, i = 0; while (i++ < n) res = res.concat("1"); while (i++ <= 32) res = res.concat("0"); return res; } // Inverse Subnetzmaske: wo sind die "Einsen" // Ersetzte diese mit Nullen und umgekehrt private static String invBits(String bits) { String res = ""; int i; for (i = 0; i < 32; i++) res = res.concat((bits.substring(i, i+1).equals("1") ? "0" : "1")); D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 3 munz return res; } // IP-Adresse mit Netzwerkmaske maslieren private static String getNetwork(String sIPBits, String sNWMaskBits) { String res = ""; int i = 0; while (i < 32) { if (sNWMaskBits.substring(i, i+1).equals("1")) { res = res.concat(sIPBits.substring(i, i+1)); } else { res = res.concat("0"); } i++; } return res; } // Subnetz Addresse: Alle Hostbits sind Null private static String getSN(String sNWBits, String sSNBits) { String res = sNWBits + sSNBits; while (res.length() < 32) res = res.concat("0"); return res; } // Broadcast Addresse: Alle Hostbits sind 1 private static String getBcast(String sNWBits, String sSNBits) { String res = sNWBits + sSNBits; while (res.length() < 32) res = res.concat("1"); return res; } // Erster Host: Subnetz Addresse + 1 private static String getFirstHost(String bits) { return bits.substring(0, 31) + "1"; } // letzter Host: Broadcastadresse - 1 private static String getLastHost(String bits) { return bits.substring(0, 31) + "0"; } // Wandeln der IP in eine für Menschen lesbare Form D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 4 munz private static String decodeIP(String bits) { String [] octet = new String[4]; octet[0] octet[1] octet[2] octet[3] = = = = bits.substring(0,8); bits.substring(8,16); bits.substring(16,24); bits.substring(24,32); return octet[0] + "." + octet[1] + "." + octet[2] + "." + octet[3] + " " + b2h(octet[0]) + b2h(octet[1]) + b2h(octet[2]) + b2h(octet[3]) + " " + b2o(octet[0]) + "." + b2o(octet[1]) + "." + b2o(octet[2]) + "." + b2o(octet[3]); } // Hauptrechner private static String calcSubnetting(String sIP, int iNW, int iSN, boolean bZeroSN) { int i, nSubnets; String res = ""; String [] octet = new String[4]; StringTokenizer st; int [] iOctet = new int[4]; // Abfangen von nicht gewünschten Fällen if (iNW < 0) return "Fehler: negative Anzahl an Netzwerkbits\n"; else if (iSN < 0) return "Fehler: negative Anzahl an Subnetzbits\n"; else if (0 == iNW) return "Fehler: Netzwerkbits = 0 - kein Netzwerk?\n"; else if ((iNW + iSN) > 30) // Subnetz benötigt eine Netzwerk Addresse, mindestens zwei Hosts // und eine Broadcastadresse return "Fehler: die Summe der Netzwerk und Subnetzbits überschreitet 30\n"; // Oktette von der IP holen try { st = new StringTokenizer(sIP, "."); for (i = 0; i != 4; i++) { octet[i] = st.nextToken(); iOctet[i] = Integer.valueOf(octet[i]).intValue(); if (iOctet[i] < 0 || iOctet[i] > 255) { return "Ungültige IP Addresse '" + sIP + "' -- Alle Oktette sollten in einem Bereich von 0-255\n"; } } } catch (Exception e) { return "Fehler: Invalid IP address string `" + sIP + "'\n"; } String nmStr = getNetmaskStr(iNW, iSN); D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 5 munz String nwMaskStr = getNetmaskStr(iNW, 0); String ipBits = o2b(iOctet[0], 8) + o2b(iOctet[1], 0) + o2b(iOctet[2], 8) + o2b(iOctet[3], 8); String nwStr = getNetwork(ipBits, nwMaskStr); int nSubs = (int) Math.pow(2, iSN); int nHosts = (int) Math.pow(2, (32 - iNW -iSN)) - 2; if (iSN == 0) { // Subnetzberechnung findet nicht statt nSubnets = 0; } else { if (bZeroSN) { i = 0; nSubnets = nSubs; } else { nSubs -= 1; i = 1; nSubnets = nSubs - 1; } } res = res.concat("\nNW bits " + iNW + ", SN bits " + iSN + ", zero Subnetz " + (bZeroSN ? "Ein" : "Aus") + ", Alle Subnetze " + nSubnets + ", Hosts pro Subnetz " + nHosts + "\n\n"); res = res.concat("Netzwerk " + decodeIP(nwStr) + "\n"); res = res.concat("Netzwerkmaske " + decodeIP(nwMaskStr) + "\n"); res = res.concat("Netzmaske " + decodeIP(nmStr) + "\n"); res = res.concat("inverse Netzmaske " + decodeIP(invBits(nmStr)) + "\n\n"); // diesen Fall abfangen dass das Applet zum Prüfen der Netzmaske verwendet werden kann if (iSN == 0) { res = res.concat("WARNUNG: Subnetzbits = 0 - kein Subnetting?\n"); return res; } if (false == bZeroSN && 1 == iSN) { res = res.concat("Fehler: ein Subnetzbit mit zero Subnetz nicht erlaubt\n"); return res; } // IP Adresse nur mit NW bits String stub = nwStr.substring(0, iNW); while (i < nSubs) { String sSubnetPart = o2b(i, iSN); String snAddress = getSN(stub, sSubnetPart); String bcAddress = getBcast(stub, sSubnetPart); String sFirstHost = getFirstHost(snAddress); String sLastHost = getLastHost(bcAddress); ; res = res.concat(" subnetz " + (i + 1) + ":\n"); D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 6 munz res = res = res = res = i++; res.concat(" res.concat(" res.concat(" res.concat(" netzwerk " + decodeIP(snAddress) + "\n"); erster host " + decodeIP(sFirstHost) + "\n"); letzter host " + decodeIP(sLastHost) + "\n"); broadcast " + decodeIP(bcAddress) + "\n"); } return res; } // Prüfung auf Auswahl Ereignisse public void itemStateChanged(ItemEvent e ) { if (e.getSource() == chNWBits) { iNWBits = Integer.valueOf(chNWBits.getSelectedItem()).intValue(); } else if (e.getSource() == chSNBits) { iSNBits = Integer.valueOf(chSNBits.getSelectedItem()).intValue(); } } // Prüfung auf erlaubte Knopfbetätigungen public void actionPerformed(ActionEvent ev) { String buttonLabel = ev.getActionCommand(); if (buttonLabel.equals("Berechnen")) { taResult.setText(calcSubnetting(tfIP.getText().trim(), iNWBits, iSNBits,cbZeroSN.getState())); } } // Einsprung ins Programm, wenn es als Applikation laufen soll public static void main(String[] args) { if (args.length < 3) { System.out.println("Verwende: java SubCalc <IP Adresse> <Netzwerkbits> <Subnetzbits> [Subnetz zero flag]"); System.exit(1); } String sIP = args[0]; int iNW = Integer.valueOf(args[1]).intValue(); int iSN = Integer.valueOf(args[2]).intValue(); int snflag = ((args.length == 4) ? Integer.valueOf(args[3]).intValue() : 1); System.out.print(getSplashText()); System.out.print(calcSubnetting(sIP, iNW, iSN, (snflag != 0))); System.exit(0); } } D:\Dokumente und Einstellungen\Udo\Desktop\Technische Informatik\FTE1_JAVA\Sub_Calc\JAVA_Subnetting.doc 7