Montag, 28. November 2011

November 2011 / C# Anwendung mit SQL-Datenbank

C# Anwendung mit SQL-Datenbank

Mithilfe von Visual Studio kann sehr einfach eine Applikation mit integrierter SQL-Datenbank erstellt werden. Ich zeige euch hier, wie das geht.

Projekt & SQL-Datenbank erstellen:
Zuerst wird ein neues C#-Projekt erstellt, eine Windows Forms-Anwendung.
Als nächstes wird direkt eine SQL-Datenbank ins Projekt hinzugefügt:
Dazu klickt man auf das Projekt, wählt Hinzufügen und dann Neues Element. Im geöffneten Fenster wählt man nun Dienstbasierte Datenbank aus. Den Assistenten zum Konfigurieren von Datenquellen bricht man ab.

Tabelle hinzufügen:
Nun muss man auf die vorhandene Datenbank im Projektmappen-Explorer klicken, damit sich auf der linken Seite der Datenbank-Explorer öffnet.
Dort fügt man per rechtsklick auf den Ordner Tabellen eine neue Tabelle hinzu.
Als nächstes muss man die benötigten Spalten einfügen, die passenden Datentypen auswählen und am besten einen Primärschlüssel definieren.
Beim Primärschlüssel sollte der Datentyp Integer sein, das Häkchen bei "NULL zulassen" darf nicht gesetzt sein und die Eigenschaft Identitätsspezifikation muss auf Ja sein, damit der Wert automatisch gesetzt wird.
Sobald alle Spalten erstellt und angepasst sind muss die Tabelle gespeichert werden.

Datenbankdiagramm erstellen:
Per Rechtsklick auf Datenbankdiagramme im Datenbank-Explorer wird ein neues Diagramm der soeben erstellten Tabelle hinzugefügt. Das ermöglicht dem Visual Studio mit der Tabelle zu arbeiten.
Die Messagebox die auftaucht muss mit ja bestätigt werden.
Anschliessend muss man die erstellte Tabelle auswählen und Hinzufügen & Schliessen klicken.
Jetzt muss man das Diagramm nur noch abspeichern.

Optional Daten einfüllen:
(Möchte man nun Daten in die Tabelle einfügen geht das über Rechtsklick/Tabellendaten anzeigen auf die erstellte Tabelle im Datenbank-Explorer.)

Datenquelle hinzufügen:
Nun muss der Anwendung eine neue Datenquelle hinzugefügt werden. Zuerst sollte die Form geöffnet und dann auf Daten/Neue Datenquelle geklickt werden.
Datenbank auswählen --> Weiter
Erstellte Datenbank auswählen --> Weiter
Häkchen bei Verbindung Speichern setzen --> Weiter
Häkchen bei Tabellen setzen --> Fertig stellen

Daten anzeigen(GUI):
Jetzt kann man auf Daten/Datenquellen anzeigen klicken. Nun sollte man die Datenquelle, welche gerade hinzugefügt wurde sehen können. Per Klick auf die Tabelle kann zwischen einem DataGridView oder Details ausgewählt werden. Anschliessend kann die Tabelle auf das Formular gezogen werden und sie wird angezeigt.

Die Anwendung sollte jetzt fähig sein Daten zu speichern, zu löschen und zu manipulieren.

Donnerstag, 27. Oktober 2011

Oktober 2011 / Man in the middle-Angriff

Man in the middle

In unserem Englischunterricht bekamen wir den Auftrag in 2er Gruppen eine Präsentation über ein IT-Thema zu halten.

Ich und mein Kollege entschieden uns für den "Man in the middle"-Angriff.

Ich selbst hatte mit solchen Dingen noch nie zu tun und habe eigentlich keine Ahnung wie so etwas geht, aber das Interesse ist da.


Beim Man in the middle-Angriff geht es als Angreifer darum, den Netzwerkverkehr zu "überwachen", bzw. sich Zugriff auf die Daten im Netzwerkverkehr zu beschaffen.

Das macht man indem man sich physikalisch oder logisch zwischen die Kommunikationspartner innerhalb des Netzwerks "hängt" so dass der gesamte Netzwerkverkehr über den eigenen Rechner läuft. Der Angriff

Bei älteren Netzwerkstrukturen wie einem Bus-System, in denen alle Daten an jeden Teilnehmer im Netzwerk gesendet werden, ist das ziemlich einfach.

In diesem Fall muss man nur noch ein Netzwerksniffer-Programm wie z.B. Wireshark installieren & starten, womit man den Datenverkehr aufzeichnen & Anschauen kann.

In einem "normalen" Netzwerk, indem alles über Switches läuft, ist das ganze natürlich "ein wenig" komplizierter. Ich habe auch zum jetzigen Zeitpunkt noch keine Erfahrungen damit gemacht, sondern das Ganze erst gelesen. Es scheint aber erstaunlich einfach zu sein.

Abgesehen von einem Netzwerksniffer-Programm braucht man hier ein Programm, welches dem Angreifer ermöglicht, den Netzwerkverkehr über sich laufen zu lassen.

Ein solches Programm wäre z.B. Cain, welches eigentlich dazu entwickelt wurde, "verlorene" Passwörter, welche irgendwann mal z.B. auf einer Website gespeichert wurden, wieder zu finden.

Es ist also auch möglich Verschlüsselte Passwörter zu entschlüsseln und dadurch hat man wirklich vollen Zugriff auf alle Passwörter - auch aus Access- oder SQL-Datenbanken.


Mit Cain kann man nun ein ganzes Subnetz, oder auch nur ein Teil davon, nach MAC-Adressen Scannen.

Sobald man alle Adressen hat, welche man möchte kann man mit dem sogenannten ARP-spoofing beginnen.

Dazu muss man mindestens 2 Adressen (also PCs) auswählen und Cain erledigt dann die Arbeit:

In der ARP-Tabelle eines Computers sind alle nötigen IPs mit den dazugehörigen MAC-Adressen gespeichert. Cain schreibt nun in die ARP-Tabellen der beiden PCs anstelle der eigentlichen MAC-Adresse die MAC-Adresse meine PCs. So werden alle Daten welche die PCs einander sendet zuerst über meinen PC laufen.

Man hat sich also nun logisch zwischen die anderen PCs "gehängt" und ist also nun im wahrsten Sinne der "Mann in der Mitte".

Nun kann über Wireshark wieder der gesamte Datenverkehr aufgezeichnet werden.

Freitag, 30. September 2011

Septemper 2011 / Objektorientiert Programmieren mit Java

Java

Im Modul 326 - Objektorientiert entwerfen und implementieren haben wir mit der Programmiersprache Java angefangen Objektorientiert zu programmieren.

Java ist eine Objektorientierte Programmiersprache, wie z.B. C# und ist Plattformunabhängig. Das bedeutet jedes Programm, dass mit Java geschrieben wird sollte auf Linux, Microsoft usw. lauffähig sein.
Das Ganze funktioniert so, dass der geschriebene Code in einen Bytecode kompiliert wird, welcher beim Starten des Programms von der Java Virtual Machine gelesen und ausgeführt wird.

Wie üblich lernten wir erst mal grundsätzlich die Syntax kennen, welche sehr ähnlich ist wie die von C#. Auch einige Funktionen wie System.Out.Println() (Gibt eine Zeile aus) und die Entwicklungsumgebung Eclipse lernten wir kennen.


Was jedoch besonders wichtig ist in Java sind die Referenzen, oder zumindest habe ich das Gefühl dass es wichtig ist, erst mal zu verstehen, wie das genau funktioniert. Es kam immerhin bereits in einem Test und weiss man nicht wie das funktioniert, kann einiges schief gehen.

Angenommen ich hätte eine Point-Klasse, welche die Variablen x und y besitzt.
Wenn ich nun ein Objekt über eine Variable instanziiere, ist die Variable nur eine Referenz auf das eigentliche Objekt. Wenn ich nun den Wert dieser Variable einer weiteren Variable zuweise, zeigen diese auf das gleiche Objekt, Sie haben also die gleiche Referenz.
Hier ein kleines Beispiel zur Erklärung:


Point p1 = new Point(10,10) ; // 1Objekt instanziiert, Variable p1 als Referenz zugewiesen
Point p2 = p1; // 2. Variable auf dasselbe Objekt referenziert
p1.x = 5; // Ändert den x-Wert des Objekts
System.Out.Println(p2.x); // Gibt den x-Wert von p2 aus


Hier wird nun 5 Ausgegeben obwohl ich ja den x-Wert von p1 geändert habe.
Das bedeutet dass beide Variablen auf dasselbe Objekt zeigen und ich über p1 die Werte von p2 ändern kann und umgekehrt.

Was genau das bringen soll ist mir eigentlich nicht ganz klar.
Was bringt es, wenn ich die gleichen Werte über 2 Namen ansprechen kann?
Viel sinnvoller würde es mir erscheinen, wenn die beiden Variablen anschliessend nicht dieselbe Referenz haben, damit ich beide einzeln modifizieren könnte, aber das ist nun mal nicht der Fall.

Viel mehr nur Java-Bezogenes lernten wir noch nicht. Dafür begannen wir aber mit der Objektorientierung.

Objektorientierung


Zuerst muss man natürlich wissen, dass alles mit Klassen, Objekten, Eigenschaften und Methoden aufgebaut ist.
Eine Klasse ist eine allgemeingültige Beschreibung von Dingen, die in verschiedenen Ausprägungen vorkommen können, aber alle eine gemeinsame Struktur und ein gemeinsames Verhalten haben. Sie ist also ein Bauplan für die Erzeugung einzelner Ausprägungen. Diese Ausprägungen bezeichnet man als Objekte.

Normalerweise hat eine Klasse nun Eigenschaften und Methoden.
Das ganze zeige ich nun an einem kurzen Beispiel auf:

Ein Auto ist eine Klasse also der allgemeine Bauplan.
Die Klasse Auto hat nun natürlich auch mehrere Eigenschaften wie Lackfarbe, PS, Länge usw.
Ebenfalls hat sie Methoden, also Funktionen welche die Klasse ausführen kann, z.B. Fahren.


Der Sinn hinter dem Objektorientierten Programmmieren ist es nun, alles in solche Objekte zu verschachteln, damit man so die Komplexität von Softwarelösungen in den Griff bekommt.
Hier kommen nun die Stichwörter Vererbung und Abgeleitete(Sub-) bzw. Basis-(Super-)Klasse ins Spiel.
Es geht darum dass es von Klassen wie Autos auch Subklassen gibt, welche zwar die Eigenschaften und Methoden der Klasse Auto haben, diese Jedoch möglicherweise leicht verändert brauchen oder zusätzlich andere Eigenschaften und Methoden haben.
Durch die Vererbung bekommen Subklassen dieselben Eigenschaften und Methoden wie ihre Basisklassen.

Am besten zeige ich das anhand eines Beispiels:

Wir überlegen nur theoretisch, was es braucht, um Figuren wie Dreiecke, Linien, Rechtecke oder Kreise zu zeichnen(natürlich digital).

Zu allererst überlegen wir uns: was haben diese 4 Figuren gemeinsam?
Das einzige was mir hier in den Sinn kommt: sie brauchen eine Position, wo sie gezeichnet werden.
Ebenfalls müssen sie Gezeichnet werden.


Das ist nun unsere erste, also unsere Basis-Klasse: Figur
Sie hat 2 Variablen und zwar die "x" und die "y" Variable. Damit kann man nun die Position angeben.
Zusätzlich habt sie auch eine Methode "Zeichnen", mit der sie gezeichnet wird.
Den ganzen Code werde ich nun natürlich sehr vereinfacht schreiben.


Code:
public class Figur
{
int x;
int y;

public void Zeichnen();
}


Dreick, Linie, Rechteck und Kreis werden nun als Subobjekte vom Objekt Figur erstellt.

Dazu schreibt man hinter den Klassennamen extends "Basisklasse" hin. Beispiel:
public class Dreieck extends Figur{}


Alle Subklassen haben nun ihre eigene Spezialisierung der Basisklasse.
Die Linie braucht z.B. bloss einen weiteren Punkt.
Das Rechteck hingegen braucht eine Länge und eine Breite.
Der Kreis zusätzlich einen Durchmesser.
Das Dreieck 2 weitere Punkte.


Ebenfalls wird in jeder Subklasse die Methode "Zeichnen" der Basisklasse überschrieben.
Dazu muss in der Subklasse bloss eine Methode erstellt werden, welche den exakt selben Namen hat wie die in der Basisklasse.


Natürlich kann man über eine Objekt einer Subklasse immer noch auf die Methoden der Basisklasse zugreifen, jedoch muss ich hier auch mal Schluss machen, da das ein riesiges Thema ist.

Montag, 15. August 2011

August 2011 / C# AccessDB auf DataGridView

Zugriff auf Access-DB mit C#

Auftrag:
In der Firma bekam ich den Auftrag, ein Testprogramm zu schreiben, welches eine Möglichkeit bietet, Daten aus einer Access-Datenbank zu lesen, zu manipulieren und zu schreiben.
Als erstes erstellte ich mir eine ganz simple Access Datenbank mit 1. Tabelle.
Anschliessend versuchte ich einmal eine Datenbankverbindung herzustellen und das ganze einer Listview zuzuweisen, da ich in einem Anderen Projekt Erfahrungen mit diesem Objekt gesammelt habe.
Die Verbindung konnte ich zwar nach kleineren Problemen Herstellen, doch schlussendlich hat es nicht so funktioniert, wie ich wollte. Das Handling der Listview ist für diese Situation nicht sehr angenehm.
Ich stiess auf das Objekt DataGridView, welches genau dazu da ist, Daten anzuzeigen.

Code:
Zuerst muss ein Connecting-String definiert werden. Im Internet findet man Oftmals folgendes dazu:

String strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Datenbank.mdb";

Mit diesem String wird meines Wissens auf eine Datenbank von Access 2003 oder älter zugegriffen.
Zumindest hat er bei mir nicht funktioniert.
Für Access 2007 habe ich folgenden Connecting-String erfolgreich verwendet:

String strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\\Datenbank.accdb;"

Anschliessend wird ein Select-Statement in einem String gespeichert. In meinem Fall sah das so aus:

strAbfrage = "Select * FROM TestTabelle";

Nun muss ein OleDbDataAdapter erstellt werden. Er dient als Brücke zwischen dem DataTable und der Datenbank. Als Parameter werden das Select-Statement und der ConnectingString mitgegeben:

OleDbDataAdapter dAdapter = new OleDbDataAdapter(strAbfrage, StrConnect);

Das nächste Objekt heisst OleDbCommandBuilder. Es generiert automatisch SQL-Code um die Änderungen, welche wir an unserem DataTable machen, der Datenbank mitzuteilen:

OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);

Natürlich brauchen wir noch ein DataTable. Dieses Objekt speichert unsere Daten Temporär, damit wir sie später wieder in die Datenbank schreiben können:

DataTable dTable = new DataTable();

Nun füllen wir das DataTable noch mit den Daten:

dAdapter.Fill(dTable);

Nun haben wir die Daten ins DataTable gefüllt.
Jetzt müssen wir sie noch mit dem DataGridView synchronisieren.
Dazu erstellen wir ein BindingSource-Objekt:

BindingSource bSource = new BindingSource();

Natürlich muss der BindingSource noch das DataTable und dem DataGridView die BindingSource bekannt gemacht, also zugewiesen werden:

bSource.DataSource = dTable;
dgvTest.DataSource = bSource;

Nun funktioniert alles bis auf das synchronisieren mit der Datenbank, denn der OleDbDataAdapter synchronisiert die Daten ja nicht immer mit der Datenbank, sondern nur mit folgendem Befehl:

dAdapter.Update(dTable);

Diesen Befehl kann man nun z.B. per Knopfdruck, beim Verlassen einer Zelle oder beim Validating Event des DataGridViews aufrufen.

Wichtig wäre nun noch ein korrektes Error-Handling.
Was ich bis jetzt eingebaut habe ist das Error-Handling bei falschen Daten. Wenn man also Text anstelle von Zahlen eingibt, wo zahlen gefordert werden.
Wird das gemacht, wird dar DataError-Event ausgelöst. Dort kann dann reagiert werden.

Montag, 4. Juli 2011

Juli 2011 / Routing

Routing

Unter Routing versteht man das Festlegen der Wege in bzw. zwischen Netzwerken, um Daten möglichst schnell zu übertragen.
Das ganze kann man am besten mit einem Zugnetz vergleichen. Die Bahnhöfe sind dabei die Router und die Züge die einzelnen Daten-Pakete.
Angenommen ein Zug kommt auf Bern und will Richtung Thun weiter. Wenn der Bahnhof alle Informationen hat die er benötigt, findet er schnell heraus, dass er den Zug am besten über Münsingen leiten würde, da dies der schnellste Weg ist.
Was aber macht der Bahnhof wenn diese Verbindung unterbrochen oder ihm gar nicht bekannt ist?
Er sucht, die nächst beste Variante heraus. In diesem Fall würde er den Zug nun über Belp fahren lassen.
Dieses Vorgehen würde er wiederholen, bis er eine funktionierende Verbindung findet.
Wie bereits erwähnt muss der Bahnhof jedoch genau wissen, wo er die Züge überall durch leiten kann.

Beim Router wird das in der Sogenannten Routing-Tabelle gespeichert.
Diese besteht aus folgenden Spalten:
- Zieladresse: Die 1. IP des Zielnetzes.
- Netzmaske: Die Subnetzmaske des Zielnetzes
- Gateway: Adresse des nächsten ihm bekannten Ziels (Kann eigene IP sein)
- Schnittstelle: IP-Adresse der Schnittstelle zum jeweiligen Netz.

- Metrik: Dient zur Priorisierung der möglichen Wege


Das Ganze funktioniert ziemlich einfach.

Wir gehen von folgender Situation aus:

Wir haben 2 Router und 3 Netze.

Router Nr. 1 verbindet das Netz 192.168.0.0/24 mit dem Netz 192.168.1.0/24.

Router Nr. 2 verbindet das Netz 192.168.1.0/24 mit dem Netz 192.168.2.0/24.

Die Netze 192.168.0.0/24 und 192.168.2.0/24 haben also keine direkte Verbindung, müssen also über das Netz 192.168.1.0/24 verbinden.

Der Router Nr. 2 hat nebst den Standard-Routen, loopback-Routen usw. noch folgende Einträge:



Daraus sieht man also im 1. Eintrag, dass der Router, wenn er etwas ins 192.168.0.0-Netz schicken muss, über den Gateway 192.168.1.1 und die Schnittstelle 192.168.1.2 gehen muss.

Die IP-Adresse das Gateways entspricht dabei Router Nr. 1 da dieser das Paket ins nächste bzw. Ziel-Netz schicken muss.

Die Schnittstelle entspricht dabei der eigenen IP-Adresse im Netz 192.168.1.0 durch welches das Paket übertragen werden muss.


Solche Routing-Tabellen könnten natürlich fast unendlich lang werden.

Standard-Router wie wir sie von zuhause kennen, verbinden jedoch nur das eigene LAN-Netzwerk mit dem "Internet".

Solche Router schicken alles, was Richtung Internet geht einfach Richtung Provider und dieser kümmert sich dann um die Weiterleitung.

Mittwoch, 22. Juni 2011

Juni 2011 / Sortier-Programm




Sortier-Programm

Im Modul 318 - Analysieren und objektbasiert programmieren mit Komponenten bekamen wir den Auftrag, ein Programm mit Visual Basic .NET zu programmieren, welches Texte nach Ziffern oder Wörtern alphabetisch sortieren kann.

Dazu mussten wir mindestens 2 Sortieralgorithmen programmieren und das GUI des Programms möglichst Benutzerfreundlich gestalten.
Der 1. Sortieralgorithmus war einer der folgenden:


Bubble-Sort:
Der Bubble-Sort vergleicht der Reihe nach zwei benachbarte Elemente und vertauscht diese, falls sie in der falschen Reihenfolge stehen. Dieser Vorgang wird so lange wiederholt bis alle Elemente in der richtigen Reihenfolge sind und somit nichts mehr vertauscht werden kann.
Nachteil: Er ist der Langsamste Sortieralgorithmus.


Select-Sort:

Beim Select-Sort wird ein Feld einmal komplett durchlaufen. Dabei wird durch einfache Vergleiche das Grösste (oder kleinste) Element herausgesucht und ans Ende (bzw. zum Anfang) des Feldes gesetzt.
Dieser Schritt wird nun mit dem kleineren Teilfeld(Feld ohne das letzte bzw. erste Element) wiederholt, bis alle Elemente richtig eingeordnet sind.


Insert-Sort:

Beim Insert-Sort wird zuerst 1 Element eingefügt. Anschliessend wird dieses Feld um ein weiteres Element erweitert. Dieses neue Element wird durch Vergleiche und Verschiebungs- oder Vertauschungsoperationen an die richtige Stelle im Feld platziert.
Dieser Schritt wird wiederholt, bis alle Elemente im Feld eingereiht sind.


Ich entschied mich vorerst für den Insert-Sort, da dieser etwas komplizierter war und mich daher auch etwas mehr forderte.
Zu unserem ausgewählten Algorithmus sollten wir nun ein sogenanntes Struktogramm erstellen:


Nun musste jede Person noch einen 2. Algorithmus erstellen. Und das war der

Quick-Sort:
Der Quicksort teilt das zu sortierende Feld in 2 Teilfelder. Dazu wählt er ein beliebiges Element (bei mir das in der Mitte) aus dem Feld und positioniert alle kleineren Elemente links und alle grösseren Elemente rechts davon.
Anschliessend wiederholt er diesen Vorgang mit den erstellten Teilfeldern, bis alle Elemente richtig positioniert sind.
Auch hier mussten wir wieder ein bzw. zwei Struktogramme erstellen:


Das Programmieren der Algorithmen an sich war nicht wirklich schwierig, man konnte den gesamten Code eigentlich aus den Struktogrammen lesen.
Die Funktionen die ich gebraucht habe wie Mid(), Len(), Trim() und Split() kannte ich alle bereits von früheren Programmierarbeiten.
Was ich spannender fand, war das Programmieren des GUIs, da ich neue Sachen kennen gelernt habe.


Die Abfrage des Active-Conrols:
Diese Abfrage habe ich gebraucht, um zu überprüfen ob meine Icons auf enabled gesetzt werden können oder nicht.
Würde ich das nämlich nicht überprüfen und versuchen den "markierten" Text zu kopieren oder auszuschneiden würde das Programm abstürzen.
Da ich nur mit Textboxen gearbeitet habe, überprüfe ich mit Hilfe der ActiveControl-Eigenschaft der Form, ob eine Textbox ausgewählt ist.
Aber bevor nun etwas kopieren kann muss ich auch noch überprüfen, ob überhaupt ein Text markiert ist. Im Ganzen sieht das dann so aus


If TypeOf Me.ActiveControl Is Textbox Then
If CType(Me.ActiveControl, Textbox).SelectedText <> "" Then
Kopieren
End If
End If


Das arbeiten mit dem Clipboard:
Wie bereits vorhin angesprochen hab ich die Funktionen um Text zu Kopieren, Auszuschneiden, und einzufügen programmiert.


Kopieren/Auschneiden:
Um etwas ins Clipboard zu speichern wird die Clipboard-Methode SetDataObject verwendet:


Clipboard.SetDataObject(CType(Me.ActiveControl,Textbox).SelectedText)


Beim Ausschneiden wird anschliessend über das ActiveControl noch der ausgewählte Text gelöscht.


Einfügen:
Beim Einfügen habe ich immer noch etwas mehr überprüfen müssen. Den ohne gespeicherten Text kann man auch nichts einfügen.
Dazu wird mithilfe der Clipboard-Methode GetDataObejct der gespeicherte Text abgefragt.
Die Abfrage, ob nun Text gespeichert ist oder nicht sieht so aus:


If Clipboard.GetDataObject.GetData(DataFormats.Text) <> "" Then


Das Einfügen Selbst ist sehr ähnlich wie das überprüfen:


CType(Me.ActiveControl,TextBox).SelectedText = _
Clipboard.GetDataObject.GetData(DataFormats.Text)


Die Open-/Save-FileDialogs:
Mithilfe der Dialoge kann man sehr schwierige Funktionen sehr vereinfachen.
Der OpenFileDialog wird dazu verwendet Dateien zu öffnen und der SaveFileDialog logischerweise um Dateien zu Speichern.


Bei beiden Dialogen muss man zuerst ein Objekt als solchen Dialog Initialisieren:


Dim dlgSaveFile As New SaveFileDialog()
Dim dlgOpenFile As New OpenFileDialog()


Anschliessend kann man einen Filter setzten, damit nicht alle Dateien angezeigt werden. Man kann auch über die Eigenschaft RestoreDirectory festlegen, ob sich das Programm den ausgewählten Pfad merken soll, damit es beim nächsten Aufruf denselben Pfad öffnet.
Öffnen kann man diesen Dialog mit:


If dlgSaveFile.ShowDialog() P= DialogResult.OK Then
End If


So kann direkt abgefragt werden ob auf OK geklickt wurde.

Dienstag, 24. Mai 2011

Mai 2011 / Subnetting

Subnetting

Subnetting bedeutet das unterteilen eines Grösseren Adressraums von IP-Adressen in mehrere kleinere Adressräume.
Subnetting betreibt man z.B. um ein Firmennetzwerk in örtlich- oder abteilungs-bedingte Netzwerke zu unterteilen.

Wie ist eine IP-Adresse überhaupt aufgebaut?
Eine IP-Adresse der IPv4 besteht aus 4 Dezimalzahlen. Jede dieser Dezimalzahlen besteht aus 8 Bits was bedeutet, dass jede dieser Dezimalzahlen eine Zahl von 0 bis 255 darstellen kann.
Beispiel:
196.168.1.255
11000100.10101000.00000001.11111111
Insgesamt ermöglicht das 4294967296 verschiedene Kombinationen, also fast 4,3 Milliarden.
Diese Adressen sind jedoch nun bereits alle vergeben und daher sollte bald die IPv6 mit 128 anstatt 32 Bit herauskommen.

Wie funktioniert Subnetting?
Da das die IPv6 aber noch nicht eingeführt wurde, beschreibe ich hier das Subnetting mit IPv4, wobei das unter IPv6 eigentlich genau gleich funktioniert.
Der IPv4 Adressraum wurde in 5 verschiedene Netzklassen unterteil.
Sie wurden jedoch später überarbeitet, da diese Netzklassen keine genügende Flexibilität boten. Es wurde durch das CIDR(Classless Inter-Domain Routing) möglich gemacht X-Beliebig grosse Netze zu vergeben. Daher kann heutzutage nichtmehr nur durch die IP-Adresse festgestellt werden, wie Gross ein Netzwerk ist.
Dazu braucht man nun die Netzmaske, welche festlegt, wie gross das Netzwerk ist.
Wie genau das CIDR funktioniert erkläre ich nach den Netzklassen.

Netzklasse A:
Diese Netzklasse hat als Binären Präfix nur ein 0.
Das bedeutet das jede IP dessen Adresse Binär mit 0 beginnt zu einem Klass A-Netz gehören sollte.
Das entspricht allen IPs von 0.0.0.0 bis 127.255.255.255
Ein solches Netz hat die Netzwerkmaske 255.0.0.0 was bedeutet dass die erste Zahl festgelegt ist und der Besitzer alle Adressen dieses Bereiches frei verwenden kann. Hätte ich also dass Klass A-Netz 12.0.0.0 hätte ich alle Adressen von 12.0.0.0 bis 12.255.255.255 was einer Anzahl von 16'777'216 Adressen entspricht.
Da man jedoch die erste und die letzte Adresse nicht verwenden kann, besitzt man genau 2 weniger.
Von diesen netzen gibt es logischerweise allerdings nur 128.

Netzklasse B:
Diese Netzklasse hat als Binären Präfix 10.
Das bedeutet das jede IP dessen Adresse Binär mit 10 beginnt zu einem Klass B-Netz gehören sollte.
Das entspricht allen IPs von 128.0.0.0 bis 191.255.255.255
Die Netzwerkmaske von diesem Netz ist 255.255.0.0 was bedeutet, dass die ersten beiden Zahlen festgelegt sind und der Besitzer alle Adressen dieses Bereichs frei verwenden kann. Hätte ich das Klass B-Netz 135.34.0.0 hätte ich alle Adressen von 135.34.0.0 bis 135.34.255.255 was einer Anzahl von 65'536 Adressen entspricht. Auch hier hätte man wieder 2 weniger.
Anzahl Klass B-Netze: 16'384

Netzklasse C:
Diese Netzklasse hat als Binären Präfix 110
Das bedeutet das jede IP dessen Adresse Binär mit 110 beginnt zu einem Klass C-Netz gehören sollte.
Das entspricht allen IPs von 192.0.0.0 bis 223.255.255.255
Die Netzwerkmaske von diesem Netz ist 255.255.255.0 was bedeutet dass die ersten 3 Zahlen festgelegt sind und der Besitzer alle Adressen dieses Bereichs frei verwenden kann. Hätte ich das Klass A-Netz 197.188.20.0 hätte ich alle Adressen von 197.188.20.0 bis 197.188.20.255 was einer Anzahl von 256 Adressen entspricht. Auch hier hätte man wieder 2 weniger.
Anzahl C-Netze: 2'097'152

Netzklasse D:
Diese Netzklasse hat als Binären Präfix 1110
Das bedeutet das jede IP dessen Adresse Binär mit 1110 beginnt zu einem Klass D-Netz gehören sollte.
Das entspricht allen IPs von 224.0.0.0 bis 239.255.255.255
Diese Klass D-Netze werden für Multicast-Anwendungen verwendet.

Netzklasse E:
Diese Netzklasse hat als Binären Präfix 1111
Das bedeutet das jede IP dessen Adresse Binär mit 1111 beginnt zu einem Klass E-Netz gehören sollte.
Das entspricht allen IPs von 240.0.0.0 bis 255.255.255.255
Diese Klass E-Netze sind für Zukünftige Zwecke reserviert.

Classless Inter-Domain Routing
Um die Funktion von CIDR zu beschreiben wechseln wir nun in die Binäre Darstellung der Zahlen.
Der CIDR-Präfix ist eine Zahl zwischen 0 und 32 der die Netzwerkmaske beschreibt. Entsprechend diesem Präfix bzw. der Netzwerkmaske sind die Netze festgelegt.
Die Präfixe der Netzklassen wären folgendermassen:
Klass A: 8 Binäre Netzwerkmaske: 11111111.00000000.00000000.00000000
Klass B: 16 Binäre Netzwerkmaske: 11111111.11111111.00000000.00000000
Klass C: 24 Binäre Netzwerkmaske: 11111111.11111111.11111111.00000000
Der Präfix bestimmt also die Anzahl festgelegter 1 innerhalb der Netzwerkmaske.
Nun könnte man auch innerhalb der eigentlichen Klass A-Netze Netze mit dem CIDM-Präfix 24 vergeben werden.
Der eigentliche Vorteil daran ist, dass man auch andere Netz-Grössen hat. Hätte man früher für ein Firmennetzwerk mit 100'000 Adressen ein Klass A Netz gebraucht - und damit über 16 millionen IPs verschwendet - kann man nun ein Netz mit dem CIDR-Präfix 15 (131'072 IPs)nehmen. Es werden zwar immer noch zu viele IPs zugewiesen, doch der Verlust ist viel geringer.

Möchte diese Firma nun jedoch nicht nur 1 grosses Netz mit 131'072 IPs sondern vieleicht 8 verschiedene Netze in dem je 12'500 Hostadressen verfügbar sind, kann man dieses Netz durch Subnetting entsprechend aufteilen:
Ich nehme an ich habe das Netz 123.34.0.0.
Dann würde mein IP-Adressraum von 123.34.0.0 bis 123.35.255.255 gehen.
Nun könnte ich diesen Adressraum ohne Probleme halbieren, indem ich ein Netz von 123.34.0.0 bis 12.34.255.255 und eins von 123.35.0.0 bis 123.35.255.255 mache.
Jedes dieser Netze hätte nun noch 65'534 Hostadressen. Jedes dieser Netze hätte nun also wieder den CIDR-Präfix 16.
Teile ich die Netze immer weiter auf komme ich schlussendlich auf 8 Netze mit jeweils 16'382 Hostadressen.
Der CIDR-Präfix dieser Netzwerke wäre nun 18.
Das 1. dieser 8 Netze hätte also eine Reichweite von 123.34.0.0 bis 123.34.63.255