# Datai aus dem Applet ausführen



## uemit1981 (7. Apr 2005)

Hallo Community,
ich habe ein Projekt indem es um eine IP-Kalkulation geht und ein manuelles Pingen geht.
Soweit ist alles fertig jedoch habe ich probleme die ping datei auszuführen.

Ich habe eine POLICY-Datei fertig gemacht die man in c:\Windows\ Kopiert und den zugriff dann erlauben soll.
Die Datei sieht so aus:

```
keystore "file:/c:/windows/java.policy";
grant
{
  permission java.io.FilePermission "<<ALL FILES>>", "read,write";
};
```
Nun würde ich es gerne in folgenden code einbinden jedoch habe ich nicht die geringste ahnung.

```
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.*;
import java.net.*;
import java.util.StringTokenizer;
import java.math.*;
import java.security.*;

public class Subnetting extends Applet     
    implements ItemListener, ActionListener {
    TextArea taResult;
    TextField tfIP;
    TextField piIP;
    Choice chNWBits, chSNBits;
    Checkbox cbZeroSN;
    Button calcButton;
    Button pingButton;
    int iNWBits = 0, iSNBits = 0, iDefaultNWBits = 24;
    boolean bDefaultZeroSN = true; // affects only Applet

    // applet inits    
    public void init() {	
	setBackground(Color.white);
	chNWBits = new Choice();
	chSNBits = new Choice();
	taResult = new TextArea("", 24, 80);
	taResult.setFont(new Font("Courier", Font.PLAIN, 12));
	taResult.setText(getSplashText());
	for (int i = 0; i <= 32; i++) {
	    chNWBits.addItem("" + i);
	    chSNBits.addItem("" + i);
	}
	if (iDefaultNWBits > 0 && iDefaultNWBits <= 32) {
	    chNWBits.select(iNWBits = iDefaultNWBits);
	}
	//setLayout(new GridLayout(4));
	add(tfIP = new TextField("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 subnet", bDefaultZeroSN));
	add(calcButton = new Button("Calculate"));
	calcButton.addActionListener(this);
	add("South", taResult);
	add(new Label("IP Pingen:"));
	add(piIP = new TextField("IP eingeben", 15));
	add(pingButton = new Button("Pingen"));
    }

    public String getAppletInfo() {
	String info = "Subnetting.java ";
	return info;
    }
    
    private static String getSplashText() {
	return "IP-Calculation";
    }

    // octet to 'bit' string 
    private static String o2b(int iOctet) {
	String res = "";
	int val = iOctet;

	for (int t = 128; t > 0; t /=2) {
	    if (val >= t) {
		res = res.concat("1");
		val -= t;
	    } else {
		res = res.concat("0");
	    }
	}
	return res;
    }
    
    // convert four bits to hex string
    private static String b2h(String sBits) {
	String res;
	int val = b2o(sBits);

	switch(val) {
	case 15: res = "f"; break;
	case 14: res = "e"; break;
	case 13: res = "d"; break;
	case 12: res = "c"; break;
	case 11: res = "b"; break;
	case 10: res = "a"; break;
	default: res = "" + val;
	}
	return res;
    }

    // 'bit' string to octet 
    private static int b2o(String sBits) {	
	if (sBits.length() == 4) {
	    return Integer.valueOf(sBits.substring(0, 1)).intValue() * 8 +
		Integer.valueOf(sBits.substring(1, 2)).intValue() * 4 +
		Integer.valueOf(sBits.substring(2, 3)).intValue() * 2 +
		Integer.valueOf(sBits.substring(3, 4)).intValue();	
	}
	return Integer.valueOf(sBits.substring(0,1)).intValue() * 128 +
	    Integer.valueOf(sBits.substring(1, 2)).intValue() * 64 +
	    Integer.valueOf(sBits.substring(2, 3)).intValue() * 32 +
	    Integer.valueOf(sBits.substring(3, 4)).intValue() * 16 +
	    Integer.valueOf(sBits.substring(4, 5)).intValue() * 8 +
	    Integer.valueOf(sBits.substring(5, 6)).intValue() * 4 +
	    Integer.valueOf(sBits.substring(6, 7)).intValue() * 2 +
	    Integer.valueOf(sBits.substring(7)).intValue();
    }

    // subnet mask: network and subnet 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 subnet mask: where there are 1's in subnet mask
    // replace those with 0's and vica versa
    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"));
	}
	return res;
    }

    // mask IP with network mask
    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;
    }

    // subnet address: all host bits are 0
    private static String getSN(String sNWBits, String sSNBits) {
	String res = sNWBits + sSNBits;	

	while (res.length() < 32) {
	    res = res.concat("0");
	}
	return res;
    }

    // broadcast address: all host bits are 1
    private static String getBcast(String sNWBits, String sSNBits) {
	String res = sNWBits + sSNBits;	

	while (res.length() < 32) {
	    res = res.concat("1");
	}
	return res;
    }

    // first host: subnet address + 1
    private static String getFirstHost(String sSN) {
	return sSN.substring(0,24) + o2b(b2o(sSN.substring(24)) + 1);
    }

    // last host: broadcast - 1
    private static String getLastHost(String sBcast) {
	return sBcast.substring(0,24) + o2b(b2o(sBcast.substring(24)) - 1);
    }

    // make IP to human-readable format
    private static String decodeIP(String bits) {
	String [] octets = new String[4];
	String [] hex = new String[8];

	octets[0] = bits.substring(0,8);
	hex[0] = b2h(octets[0].substring(0,4));
	hex[1] = b2h(octets[0].substring(4));
	octets[1] = bits.substring(8,16);
	hex[2] = b2h(octets[1].substring(0,4));
	hex[3] = b2h(octets[1].substring(4));
	octets[2] = bits.substring(16,24);
	hex[4] = b2h(octets[2].substring(0,4));
	hex[5] = b2h(octets[2].substring(4));
	octets[3] = bits.substring(24,32);
	hex[6] = b2h(octets[3].substring(0,4));
	hex[7] = b2h(octets[3].substring(4));
	return octets[0] + "." + octets[1] + "." + octets[2] + "." +
	    octets[3] + " " + 
	    hex[0] + hex[1] + hex[2] + hex[3] + hex[4] + hex[5] +
	    hex[6] + hex[7] + " " 
	    + b2o(octets[0]) + "." + b2o(octets[1]) + 
	    "." + b2o(octets[2]) + "." + b2o(octets[3]);
    }

    // the main calculator function
    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];

	// catch some pathological cases...
	if (iNW < 0) {
	    return "ERROR: negative Nummer der Netzwekbits\n";
	}
	if (iSN < 0) {
	    return "ERROR: negative Nummer der Subnetbits\n";
	}
	if (iNW == 0) {
	    return "ERROR: Netzwerkbits entsprechen Null - kein netzwerk?\n";
	}
	if ((iNW + iSN) >= 32) {
	    return "ERROR: die Anzahl der netzwerk- und subnetzbits sind größer oder gleich 32\n";
	}
	// get the IP
	try {
	    st = new StringTokenizer(sIP, ".");
	    for (i = 0; i != 4; i++) {
		octet[i] = st.nextToken();	    
		iOctet[i] = Integer.valueOf(octet[i]).intValue();
	    }
	} catch (Exception e) {
	    return "ERROR: Invalide IP '" + sIP + "'\n";
	}
	// extract and check the values of octets
	for (i = 0; i != 4; i++) {
	    if (iOctet[i] < 0 || iOctet[i] > 255) {
		return "Invalide IP addresse '" + sIP + 
		    "' -- alle octets sollten im bereich 0-255 liegen\n";
	    }
	}
	String nmStr = getNetmaskStr(iNW, iSN);
	String nwMaskStr = getNetmaskStr(iNW, 0);
	String ipBits = o2b(iOctet[0]) +  o2b(iOctet[1]) + o2b(iOctet[2]) +
	    o2b(iOctet[3]);
	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) {
	    // subnet calculation will not take place
	    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 ? "on" : "off") +
			 ", total subnetz " + nSubnets + 
			 ", Rechner per Subnetz " + nHosts + "\n\n");
	res = res.concat("netzwerk         " + decodeIP(nwStr) + "\n");
	res = res.concat("netzwerk maske    " + decodeIP(nwMaskStr) + "\n");
	res = res.concat("netzmaske         " + decodeIP(nmStr) + "\n");
	res = res.concat("umgekehrte maske " + decodeIP(invBits(nmStr)) + "\n\n");
	String stub = nwStr.substring(0, iNW);
	// catch this case here so the applet can be used for checking netmask
	if (iSN == 0) {
	    res = res.concat("WARNING: Subnetz bits gleich null - kein Subnetting?\n");
	    return res;
	}
	if (bZeroSN == false && iSN == 1) {
	    res = res.concat("ERROR: ein Subnetz bit obwohl zero Subnetz es nicht erlaubt\n");
	    return res;
	}
	while (i < nSubs) {
	    String sSubnetPart = o2b(i).substring(8 - iSN);
	    String snAddress = getSN(stub, sSubnetPart);
	    String sFirstHost = getFirstHost(snAddress);
	    String bcAddress = getBcast(stub, sSubnetPart);
	    String sLastHost = getLastHost(bcAddress);
	    res = res.concat("  Subnetz  " + (i + 1) + ":\n");
	    res = res.concat("    Netzwerk    " + decodeIP(snAddress) + "\n");
	    res = res.concat("    erster host " + decodeIP(sFirstHost) + "\n");
	    res = res.concat("    letzter host  " + decodeIP(sLastHost) + "\n");
	    res = res.concat("    Broadcast  " + decodeIP(bcAddress) + "\n");
	    i++;
	}
	return res;
    }


    // check for choice events
    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();
	}
    }

    // check for valid button events
    public void actionPerformed(ActionEvent ev) {
	String buttonLabel = ev.getActionCommand();

	if (buttonLabel.equals("Calculate")) {
	    taResult.setText(calcSubnetting(tfIP.getText().trim(), 
					      iNWBits, iSNBits, 
					      cbZeroSN.getState()));
	}
    }

    // entry point of the program when run as application
    public static void main(String[] args) {	
	if (args.length < 3) {
	    System.out.println("usage: java Subnetting <ip address> <network bits> <subnet bits> [subnet zero flag]");
	    System.exit(1);
	}
	for (int i = 0; i != args.length; i++) {
		System.out.println(args[i]);
	}
	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);
    }
}
```
Kann jemand helfen?
Wäre auf ewig dankbar.

Gruß


----------



## Gast (7. Apr 2005)

Um es etwas deutlicher zu machen.
Ich brauche nur den Befehl "PING" Diesen muss ich über das Applet ausführen können. Der button dazu existiert ja bereits.

Bin auch offen für andere vorschläge.

Gruß


----------



## abollm (7. Apr 2005)

Habe ich dich richtig interpretiert, dass du die Ausgabe des Ping-Befehls dann auch wieder in einem Textfield ausgeben willst?

Wenn ja, da würde das z.B. mit "Runtime.getRuntime().exec("cmd ping 127.0.0.1") schwierig werden. Eine andere Möglichkeit ist natürlich die, dass du dir mit Hilfe des Packages "java.net.*" eine Klasse erstellst, die dem Ping-Befehl annähernd entspricht. Dafür müsstes du dir einen Ersatz-Ping- Befehl selbst schreiben. Ping selbst kannst du nicht vollständig in nativem Java implementieren, weil Java dafür nicht maschinennah genug ist. Es hängt hier also davon ab, was genau für Informatioen dir reichen.

Eine andere Möglichkeit ist natürlich die, JNI zu benutzen.


----------



## uemit1982 (7. Apr 2005)

hi abllom, erstmal danke für die antwort.
Du hast mich richtig verstanden, es soll dann in einem textfeld angezeigt werden.
Hast du eventuell ein beispiel für mich wie man es machen könnte mit java.net.*;?
Das wäre mal echt edel.


----------



## abollm (7. Apr 2005)

uemit1982 hat gesagt.:
			
		

> hi abllom, erstmal danke für die antwort.
> Du hast mich richtig verstanden, es soll dann in einem textfeld angezeigt werden.
> Hast du eventuell ein beispiel für mich wie man es machen könnte mit java.net.*;?
> Das wäre mal echt edel.



Ja, aber das hängt davon ab, welche Informationen du benötigst. Der ursprüngliche Ping-Befehl (kommt, wenn ich mich nicht irre aus der Unix-Welt) kann ja eine ganze Menge.

Wenn du z.B. nur die IP-Adresse auflösen willst, habe ich ein Beispiel. Teile einfach einmal mit, was genau für Informationen du benötigst.


----------



## uemit1981 (7. Apr 2005)

Also im eigentlichen will ich einfach nur die ausgabe ob die ip erreichbar ist oder nicht und den rechnernamen. Wenn eine ip nicht erreichbar ist soll dann auch das feld mit dem rechner namen mit einem "-" versehen werden.
Könntest du mir da helfen.


----------



## Roar (7. Apr 2005)

was ist denn natives  java? 
und wenn der aufruf von exec() klappt, hool dir den Process den die methode liefert und lies den outputstream aus, dann hast du das ergebnis des pings.


----------



## uemit1981 (7. Apr 2005)

Hi Roar, danke für die antwort, wenn du mir auch sagen könntest, wie dann würde ich es glatt machen


----------



## abollm (7. Apr 2005)

Roar hat gesagt.:
			
		

> was ist denn natives  java?
> und wenn der aufruf von exec() klappt, hool dir den Process den die methode liefert und lies den outputstream aus, dann hast du das ergebnis des pings.



Vielleicht habe ich mich undeutlich ausgedrückt. Mit "natives Java" war gemeint, dass man nur mit den üblichen Java-Klassen arbeitet, nicht mit proprietären Klassen von Fremdherstellern etc.

@Roar: Ich habe über das Thema zuerst auch so ähnlich wie du gedacht. Aber wenn das so einfach wäre, hätte ich ein Stück Code gepostet, frei nach dem Motto "das haben wir gleich" (-> bekanntlich der kürzeste Entwicklerwitz). Grundsätzlich geht es natürlich so, wie du beschrieben hast.


----------



## Roar (7. Apr 2005)

abollm hat gesagt.:
			
		

> Ich habe über das Thema zuerst auch so ähnlich wie du gedacht. Aber wenn das so einfach wäre, hätte ich ein Stück Code gepostet, frei nach dem Motto "das haben wir gleich" (-> bekanntlich der kürzeste Entwicklerwitz). Grundsätzlich geht es natürlich so, wie du beschrieben hast.


und wo liegt das problem?


----------



## Illuvatar (7. Apr 2005)

Roar hat gesagt.:
			
		

> was ist denn natives  java?
> und wenn der aufruf von exec() klappt, hool dir den Process den die methode liefert und lies den outputstream aus, dann hast du das ergebnis des pings.


Also ich hab das schon so gemacht


----------



## uemit1981 (7. Apr 2005)

wäre dankbar über den code


----------



## abollm (7. Apr 2005)

Roar hat gesagt.:
			
		

> abollm hat gesagt.:
> 
> 
> 
> ...



In der Zeit beispielsweise.


----------



## Bleiglanz (8. Apr 2005)

Ich brauche nur den Befehl "PING" Diesen muss ich über das Applet ausführen können

=> das mit der policy funzt eh nur auf dem rechner vor dem du sitzt

=> ein applet kann nur "nach Hause" telefonieren

=> musst du also signieren etc. wenns auch auf anderen REchnern laufen soll

=> ping geht doch heutzutage eh nicht mehr (firewalls, abgeschaltet,...); besser ist

java.net.InetAddress

public boolean isReachable(int timeout)
                    throws IOException


----------



## uemit1981 (8. Apr 2005)

Hi, also es muss nur auf einem rechner für testzwecke laufen, quasi zu vorführung. Ausserdem wird dieses Script nur im Lokalen Netz verwendet.


----------



## Bleiglanz (8. Apr 2005)

>>muss nur auf einem rechner für testzwecke laufen
>>quasi zu vorführung

wozu dann das Applet?????


----------



## uemit1981 (8. Apr 2005)

Also Bleiglanz wenn du keine lust oder keine ahnung hast und mir nicht helfen kannst würde ich dich bitten diesen thread nicht als spam anzusehen!
Es gab mittlerweile 3 menschen die mir helfen wollen und lass die doch mal ihre beiträge dazu schreiben.

Aber deine frage will ich gernen och beantworten, ein applet ist nötig da es zu meiner aufgabenstellung gehört. Also kann ich kein java prog schreiben was auf der kommandozeilen ebene arbeitet.

Gruß
PS: Wäre dankbar über code vorschläge oder wie ich die ausgabe der exec() abfangen kann. Danke


----------



## abollm (8. Apr 2005)

@uemit:

Nu lass mal dein Schimpfen auf Bleiglanz, denn er wollte dir ja bloß auf seine Art sagen, ob die Lösung mit dem Applet "günstig" ist.

Ich habe mir deinen Code gerstern noch einmal kurz angesehen und in meiner Kiste gekramt. Dabei habe ich ein Stück Code gefunden, dass ich nur noch ein wenig anpassen muss, dann könnte es eine Lösung für dich sein. Ist ein allerdings etwas abenteuerlicher Ansatz.

Wenn du bis heute Abend ca. 20:00 Uhr Zeit hast, kann ich hier den Code posten, ok?


----------



## uemit1981 (8. Apr 2005)

Hi abollm,
wäre echt edel! 
Also um 20 Uhr bin ich Online. Wenn du lust hast kannst du mir diesen auch im ICQ zukommen lassen: 144252473
Danke
Gruß


----------



## abollm (8. Apr 2005)

uemit1981 hat gesagt.:
			
		

> Hi abollm,
> wäre echt edel!
> Also um 20 Uhr bin ich Online. Wenn du lust hast kannst du mir diesen auch im ICQ zukommen lassen: 144252473
> Danke
> Gruß



Ein wenig Geduld noch, mache gerade die Sache ein wenige "schöner".


----------



## uemit1981 (8. Apr 2005)

hehe, kp warte hier vor dem PC. Muss eh noch einige sachen erledigen.


----------



## abollm (8. Apr 2005)

So , hier nun der Code.

Ist alles ein wenig "über das Knie gebrochen", aber ich denke du kannst für eine Demo damit arbeiten. Zur Funktionsweise meiner Erweiterungen:

Durch Eingabe einer IP-Adresse oder eines Hostnamens im entsprechenden TextField wird mit anschließendem Drücken des Buttons "Pingen" die Ausgabe sowohl in der TextArea als auch auf der Konsole angezeigt. Bei einer so genannten "UnknownHostException" erfolgt die Ausgabe ebenfalls entsprechend.

Es gibt natürlich noch eine sehr viel umfangreichere Möglichkeit, aber diese wäre zu zeitaufwändig geworden. So hat mich das ca. 45 Minuten Arbeit gekostet -> kostet mindestens ein Bier oder Wein etc.  .

Viel Spaß damit und bei Fragen hier posten oder PN.


```
/*
 * Created on 08.04.2005
 *
 * Enhanced by abollm: Version 1.0 - 08.04.2005
 *  
 * 
 * @author 
 *
 * TODO:
 * 
 */
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.*;
import java.net.*;
import java.util.StringTokenizer;
import java.math.*;
import java.security.*;

import java.net.*;

public class Subnetting extends Applet     
    implements ItemListener, ActionListener {
    TextArea taResult;
    TextField tfIP;
    TextField piIP;
    Choice chNWBits, chSNBits;
    Checkbox cbZeroSN;
    Button calcButton;
    Button pingButton;
    
    int iNWBits = 0, iSNBits = 0, iDefaultNWBits = 24;
    boolean bDefaultZeroSN = true; // affects only Applet

    // applet inits   
    public void init() {   
   setBackground(Color.white);
   chNWBits = new Choice();
   chSNBits = new Choice();
   taResult = new TextArea("", 24, 80);
   taResult.setFont(new Font("Courier", Font.PLAIN, 12));
   taResult.setText(getSplashText());
   for (int i = 0; i <= 32; i++) {
       chNWBits.addItem("" + i);
       chSNBits.addItem("" + i);
   }
   if (iDefaultNWBits > 0 && iDefaultNWBits <= 32) {
       chNWBits.select(iNWBits = iDefaultNWBits);
   }
   //setLayout(new GridLayout(4));
   add(tfIP = new TextField("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 subnet", bDefaultZeroSN));
   add(calcButton = new Button("Calculate"));
   calcButton.addActionListener(this);
   add("South", taResult);
   add(new Label("IP Pingen:"));
   add(piIP = new TextField("IP / Hostname eingeben", 15));
   add(pingButton = new Button("Pingen"));
   //
   pingButton.addActionListener(new ExecutePing());
    }

    public String getAppletInfo() {
   String info = "Subnetting.java ";
   return info;
    }
   
    private static String getSplashText() {
   return "IP-Calculation";
    }

    // octet to 'bit' string
    private static String o2b(int iOctet) {
   String res = "";
   int val = iOctet;

   for (int t = 128; t > 0; t /=2) {
       if (val >= t) {
      res = res.concat("1");
      val -= t;
       } else {
      res = res.concat("0");
       }
   }
   return res;
    }
   
    // convert four bits to hex string
    private static String b2h(String sBits) {
   String res;
   int val = b2o(sBits);

   switch(val) {
   case 15: res = "f"; break;
   case 14: res = "e"; break;
   case 13: res = "d"; break;
   case 12: res = "c"; break;
   case 11: res = "b"; break;
   case 10: res = "a"; break;
   default: res = "" + val;
   }
   return res;
    }

    // 'bit' string to octet
    private static int b2o(String sBits) {   
   if (sBits.length() == 4) {
       return Integer.valueOf(sBits.substring(0, 1)).intValue() * 8 +
      Integer.valueOf(sBits.substring(1, 2)).intValue() * 4 +
      Integer.valueOf(sBits.substring(2, 3)).intValue() * 2 +
      Integer.valueOf(sBits.substring(3, 4)).intValue();   
   }
   return Integer.valueOf(sBits.substring(0,1)).intValue() * 128 +
       Integer.valueOf(sBits.substring(1, 2)).intValue() * 64 +
       Integer.valueOf(sBits.substring(2, 3)).intValue() * 32 +
       Integer.valueOf(sBits.substring(3, 4)).intValue() * 16 +
       Integer.valueOf(sBits.substring(4, 5)).intValue() * 8 +
       Integer.valueOf(sBits.substring(5, 6)).intValue() * 4 +
       Integer.valueOf(sBits.substring(6, 7)).intValue() * 2 +
       Integer.valueOf(sBits.substring(7)).intValue();
    }

    // subnet mask: network and subnet 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 subnet mask: where there are 1's in subnet mask
    // replace those with 0's and vica versa
    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"));
   }
   return res;
    }

    // mask IP with network mask
    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;
    }

    // subnet address: all host bits are 0
    private static String getSN(String sNWBits, String sSNBits) {
   String res = sNWBits + sSNBits;   

   while (res.length() < 32) {
       res = res.concat("0");
   }
   return res;
    }

    // broadcast address: all host bits are 1
    private static String getBcast(String sNWBits, String sSNBits) {
   String res = sNWBits + sSNBits;   

   while (res.length() < 32) {
       res = res.concat("1");
   }
   return res;
    }

    // first host: subnet address + 1
    private static String getFirstHost(String sSN) {
   return sSN.substring(0,24) + o2b(b2o(sSN.substring(24)) + 1);
    }

    // last host: broadcast - 1
    private static String getLastHost(String sBcast) {
   return sBcast.substring(0,24) + o2b(b2o(sBcast.substring(24)) - 1);
    }

    // make IP to human-readable format
    private static String decodeIP(String bits) {
   String [] octets = new String[4];
   String [] hex = new String[8];

   octets[0] = bits.substring(0,8);
   hex[0] = b2h(octets[0].substring(0,4));
   hex[1] = b2h(octets[0].substring(4));
   octets[1] = bits.substring(8,16);
   hex[2] = b2h(octets[1].substring(0,4));
   hex[3] = b2h(octets[1].substring(4));
   octets[2] = bits.substring(16,24);
   hex[4] = b2h(octets[2].substring(0,4));
   hex[5] = b2h(octets[2].substring(4));
   octets[3] = bits.substring(24,32);
   hex[6] = b2h(octets[3].substring(0,4));
   hex[7] = b2h(octets[3].substring(4));
   return octets[0] + "." + octets[1] + "." + octets[2] + "." +
       octets[3] + " " +
       hex[0] + hex[1] + hex[2] + hex[3] + hex[4] + hex[5] +
       hex[6] + hex[7] + " "
       + b2o(octets[0]) + "." + b2o(octets[1]) +
       "." + b2o(octets[2]) + "." + b2o(octets[3]);
    }

    // the main calculator function
    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];

   // catch some pathological cases...
   if (iNW < 0) {
       return "ERROR: negative Nummer der Netzwekbits\n";
   }
   if (iSN < 0) {
       return "ERROR: negative Nummer der Subnetbits\n";
   }
   if (iNW == 0) {
       return "ERROR: Netzwerkbits entsprechen Null - kein netzwerk?\n";
   }
   if ((iNW + iSN) >= 32) {
       return "ERROR: die Anzahl der netzwerk- und subnetzbits sind größer oder gleich 32\n";
   }
   // get the IP
   try {
       st = new StringTokenizer(sIP, ".");
       for (i = 0; i != 4; i++) {
      octet[i] = st.nextToken();      
      iOctet[i] = Integer.valueOf(octet[i]).intValue();
       }
   } catch (Exception e) {
       return "ERROR: Invalide IP '" + sIP + "'\n";
   }
   // extract and check the values of octets
   for (i = 0; i != 4; i++) {
       if (iOctet[i] < 0 || iOctet[i] > 255) {
      return "Invalide IP addresse '" + sIP +
          "' -- alle octets sollten im bereich 0-255 liegen\n";
       }
   }
   String nmStr = getNetmaskStr(iNW, iSN);
   String nwMaskStr = getNetmaskStr(iNW, 0);
   String ipBits = o2b(iOctet[0]) +  o2b(iOctet[1]) + o2b(iOctet[2]) +
       o2b(iOctet[3]);
   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) {
       // subnet calculation will not take place
       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 ? "on" : "off") +
          ", total subnetz " + nSubnets +
          ", Rechner per Subnetz " + nHosts + "\n\n");
   res = res.concat("netzwerk         " + decodeIP(nwStr) + "\n");
   res = res.concat("netzwerk maske    " + decodeIP(nwMaskStr) + "\n");
   res = res.concat("netzmaske         " + decodeIP(nmStr) + "\n");
   res = res.concat("umgekehrte maske " + decodeIP(invBits(nmStr)) + "\n\n");
   String stub = nwStr.substring(0, iNW);
   // catch this case here so the applet can be used for checking netmask
   if (iSN == 0) {
       res = res.concat("WARNING: Subnetz bits gleich null - kein Subnetting?\n");
       return res;
   }
   if (bZeroSN == false && iSN == 1) {
       res = res.concat("ERROR: ein Subnetz bit obwohl zero Subnetz es nicht erlaubt\n");
       return res;
   }
   while (i < nSubs) {
       String sSubnetPart = o2b(i).substring(8 - iSN);
       String snAddress = getSN(stub, sSubnetPart);
       String sFirstHost = getFirstHost(snAddress);
       String bcAddress = getBcast(stub, sSubnetPart);
       String sLastHost = getLastHost(bcAddress);
       res = res.concat("  Subnetz  " + (i + 1) + ":\n");
       res = res.concat("    Netzwerk    " + decodeIP(snAddress) + "\n");
       res = res.concat("    erster host " + decodeIP(sFirstHost) + "\n");
       res = res.concat("    letzter host  " + decodeIP(sLastHost) + "\n");
       res = res.concat("    Broadcast  " + decodeIP(bcAddress) + "\n");
       i++;
   }
   return res;
    }


    // check for choice events
    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();
   }
    }

    // check for valid button events
    public void actionPerformed(ActionEvent ev) {
   String buttonLabel = ev.getActionCommand();

   if (buttonLabel.equals("Calculate")) {
       taResult.setText(calcSubnetting(tfIP.getText().trim(),
                     iNWBits, iSNBits,
                     cbZeroSN.getState()));
   }
    }

    //
    class ExecutePing implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String strip = piIP.getText().trim();
            
            // Nur zu Kontrollzwecken Ausgabe auf Konsole
            //System.out.println(strip);
            
            try {
                //Hole angeforderte IP-Adresse bzw. Host-Name
                InetAddress addr = InetAddress.getByName(strip);
                // Konsolenausgabe
                String host = addr.getHostName();
                String ip = addr.getHostName();
                System.out.println("Host-Name der IP: "+host);
                System.out.println("IP des Hosts: "+ip);
                String taOut = "Host: "+host+"\n" +
                		"IP des Hosts: "+ip;
                taResult.setText(taOut);
                //taResult.setText(addr.getHostAddress());
              } catch (UnknownHostException uhe) {
                // Konsolenausgabe
                  System.err.println(uhe.toString());
                // Ausgabe der Exception in TextArea
                  taResult.setText(uhe.toString());
                  
                // falls Programmabbruch, dann folgende Zeile entkommentieren
                //System.exit(1);
              }
        }
    }

    
    // entry point of the program when run as application
    public static void main(String[] args) {   
   if (args.length < 3) {
       System.out.println("usage: java Subnetting <ip address> <network bits> <subnet bits> [subnet zero flag]");
       System.exit(1);
   }
   for (int i = 0; i != args.length; i++) {
      System.out.println(args[i]);
   }
   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);
    }
}
```


----------



## uemit1981 (8. Apr 2005)

Der HAMMER!!!!
Danke dir!!!

Hab da aber noch eine frage, ich erkenne leider nicht ob der host erreichbar ist oder nicht. Wo bekomme ich das genau hin?

Gruß und nochmal besten dank!!!


----------



## abollm (8. Apr 2005)

uemit1981 hat gesagt.:
			
		

> Hab da aber noch eine frage, ich erkenne leider nicht ob der host erreichbar ist oder nicht. Wo bekomme ich das genau hin?



Ja, da muss noch etwas angefrickelt werden. Ich schau einmal kurz. Wenn ich im Laufe der nächsten 15 Minuten nichts habe, dann musst du dich selbst einmal mit den Methoden des Packages "java.net.*" herumschlagen oder bis morgen warten.


----------



## uemit1981 (8. Apr 2005)

Ok wenn ich in 15 minuten von dir nichts höre werde ich welber mal nachschauen aber ich würde auch gerne bis morgen warten um deine lösung mir anzugucken.

Danke

Gruß


----------



## abollm (8. Apr 2005)

uemit1981 hat gesagt.:
			
		

> Ok wenn ich in 15 minuten von dir nichts höre werde ich welber mal nachschauen aber ich würde auch gerne bis morgen warten um deine lösung mir anzugucken.



So, hier also die Veränderungen. Bleiglanz hatte oben zudem schon darauf hingewiesen. Ich war nur mal wieder zu faul, mir seine Hinweise durchzulesen.

Tausche folgenden Code entsprechend mit dem vorhandenen aus, dann sollte es richtig funktionieren:


```
class ExecutePing implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String strip = piIP.getText().trim();
            
            // Nur zu Kontrollzwecken Ausgabe auf Konsole
            //System.out.println(strip);
            
            try {
                //Hole angeforderte IP-Adresse bzw. Host-Name
                InetAddress addr = InetAddress.getByName(strip);
                long start=System.nanoTime();
                // Konsolenausgabe
                String host = addr.getHostName();
                String ip = addr.getHostName();
                if(InetAddress.getByName(ip).isReachable(1000)) {
                    System.out.println("Host:"+host+"gefunden. Benötigte Zeit: "+(System.nanoTime()-start)/1000000);
                    System.out.println("Host-Name der IP: "+host);
                    System.out.println("IP des Hosts: "+ip);
                    String taOut = "Host: "+host+"\n" +
            		"IP des Hosts: "+ip;
                    taResult.setText(taOut);
                } else {
                    System.out.println("Kein Host unter "+host+" gefunden!");
                    taResult.setText("Kein Host unter "+host+" gefunden!");
                }
                
                
                
                //taResult.setText(addr.getHostAddress());
              } catch (Exception uhe) {
              //} catch (Exception uhe) {
                // Konsolenausgabe
                  System.err.println(uhe.toString());
                // Ausgabe der Exception in TextArea
                  taResult.setText(uhe.toString());
                  
                // falls Programmabbruch, dann folgende Zeile entkommentieren
                //System.exit(1);
              }
        }
    }
```


----------



## uemit1981 (8. Apr 2005)

du bist echt ein engel!!!
Habe ich nun gemacht. Bekomme zwar eine fehlermeldung die dies besagt:
java.net.SocketException: Unrecognized Windows Sockets error: 10106: Can't create socket
werde aber mal sehen was das internet darüber hergibt.
DANKE 

Gruß


----------



## abollm (8. Apr 2005)

uemit1981 hat gesagt.:
			
		

> Bekomme zwar eine fehlermeldung die dies besagt:
> java.net.SocketException: Unrecognized Windows Sockets error: 10106: Can't create socket
> werde aber mal sehen was das internet darüber hergibt.
> DANKE
> ...



Ja, das kann an der Netzwerkverbindung liegen. Testet du in einem Intranet oder über eine ISP-Anbindung?

Mir ist außerdem im Intranet aufgefallen, dass man in bestimmten Fällen eine bestimmte Zeit zwischen zwei unterschiedlichen Pings (erreichbarer Host vs. unerreichbarer) warten muss. Aber das sind halt die Restriktionen bei einer gefrickelten Lösung.


----------



## uemit1981 (8. Apr 2005)

nur im intranet, habe aber eben in einem forum gelesen, dass user die joe benutzen diese probleme haben. Problem, ich benutze JOE 
Ich werde Eclipse gleich testen und mal sehen was er dann ausspuckt. Bin mir aber nicht sicher ob die ausgabe im applet wirklich was mit joe zutun hat denn bei der compilierung kommt kein fehler.


----------



## abollm (8. Apr 2005)

uemit1981 hat gesagt.:
			
		

> nur im intranet, habe aber eben in einem forum gelesen, dass user die joe benutzen diese probleme haben. Problem, ich benutze JOE
> Ich werde Eclipse gleich testen und mal sehen was er dann ausspuckt. Bin mir aber nicht sicher ob die ausgabe im applet wirklich was mit joe zutun hat denn bei der compilierung kommt kein fehler.



OK, dann noch viel Erfolg. Ich gehe jetzt mal offline.

Gruß


----------



## Gast (8. Apr 2005)

danke nochmals


----------



## uemit1981 (9. Apr 2005)

Hi, also et lüppt tadellos 
Lag echt nur an JOE. Mit Eclipse funktioniert alles.
Weiss echt nicht wie ich dir danken soll.

Gruß


----------



## abollm (9. Apr 2005)

uemit1981 hat gesagt.:
			
		

> Hi, also et lüppt tadellos
> Lag echt nur an JOE. Mit Eclipse funktioniert alles.
> Weiss echt nicht wie ich dir danken soll.
> Gruß



Na, dann ist ja alles in Butter.
Ein Dankeschön hast du ja bereits ausgesprochen. Ist schon ok. Wenn es mich nicht interessiert hätte, hätte ich es kaum gemacht.

BTW: Ich schreibe dein Applet gerade auf Swing um und versehe es mit einem besseren Layout.

Gruß


----------



## uemit1981 (9. Apr 2005)

wo liegt der unterschied zwischen einem swing und einem applet?
Würde mir das dann gerne mal ansehen.
Ich versehe momentan das applet mit hintergrundfarben und den zeuch.
Hab da aber noch eine frage an dich. Gibt es in java so eine art stylesheet datei? Also wo du eventuell die eingabefelder nur mit einem feinen schwarze strich umranden kannst anstatt wie es momentan ist?

Gru0


----------



## Illuvatar (9. Apr 2005)

1. Es gibt erstens den Unterschied Applet - Applikation und 2. Den Unterschied AWT - Swing. Sowohl Applet als auch Applikation können sowohl AWT als auch das besser aussehende Swing verwenden. Für Swing wird aber eine VM >= 1.2 benötigt, und die ist auf so gut wie keinem Rechner vorhanden, deshalb eignet es sich für Applets weniger eigentlich.

2. In Java gibt es keine Stylesheet-Dateien. Alles steht schon im Code drin. Das ist das, was bei C# bzw. bei .NET als neue Eigenschaft des One-Stop-Codings propagiert wird^^. Bei Swing gibt es die Klasse Border, mit der so etwas realisiert werden kann.


----------



## uemit1981 (9. Apr 2005)

Danke für die erläuterung, könntest du mir eventuell einige stichworte nennen wonach ich im google suchen kann zu dem "styling" in java.

Gruß


----------



## Illuvatar (9. Apr 2005)

Öh lies ein gutes Buch
www.java-forum.org/de/javabuch bzw. zum Download www.javabuch.de
und
http://www.galileocomputing.de/openbook/javainsel4/


----------

