Subnetting Beispiel

Werbung
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
Herunterladen