Senden von TCP/IP-Telegrammen aus einem Visual Basic
Transcription
Senden von TCP/IP-Telegrammen aus einem Visual Basic
1 Senden von TCP/IP-Telegrammen aus einem Visual Basic-Programm Von: Fabian Baur, Matrikelnummer 156002 und Daniel Letzgus, Matrikelnummer 156040 Seminararbeit an der Fachhochschule Heilbronn Studiengang: Wirtschaftsingenieurwesen Lehrveranstaltung: Ausgewählte Kapitel der Automatisierungstechnik Abgabedatum: 15. Dezember 2003 Betreuer: Prof. Dr.-Ing. H. Frank Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 2 Inhaltsverzeichnis 1. Einleitung......................................................................................................... 4 2. Konkrete Aufgabenstellung.......................................................................... 5 3. Grundlagen...................................................................................................... 6 3.1 Das TCP/IP – Protokoll ............................................................................ 6 3.1.1 Einordnung in das ISO/OSI - Referenzmodell............................. 6 3.1.2 Das TCP - Protokoll........................................................................... 7 3.1.2.1 Die Phasen einer TCP-Verbindung [7] ................................... 8 Die Einrichtungsphase ......................................................................... 8 Die Datenaustauschphase ................................................................ 10 Die Abschlussphase............................................................................ 10 3.1.3 Das IP – Protokoll ........................................................................... 12 3.2 Das Winsock – Objekt in Visual Basic ................................................ 13 3.2.1 Kurzbeschreibung:.......................................................................... 13 3.2.2 Eigenschaften [104]..................................................................... 14 3.2.3 Ereignisse [6] ................................................................................. 16 3.2.4 Methoden [6].................................................................................. 19 4. Lösung der Aufgabenstellung .................................................................... 25 4.1 Senden von TCP/IP – Telegrammen aus Visual Basic .................... 26 4.1.1 Die Benutzeroberflächen ............................................................... 26 4.1.2 Programmablaufpläne .................................................................... 27 4.1.2.1 Verbindungsaufbau.................................................................. 28 4.1.2.2 Textversand von Server an Client ........................................ 29 4.1.2.3 Textversand von Client an Server ........................................ 30 4.2 Die Protokollanalyse mit „Ethereal“.................................................... 33 Literaturhinweise .............................................................................................. 37 Anhang Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 3 Abbildungsverzeichnis Abbildung 3-1: ISO OSI Referenzmodell [2] ................................................................... 7 Abbildung 3-2: Der TCP Header [8] .................................................................................... 8 Abbildung 3-3: Die Einrichtungsphase [7] ....................................................................... 9 Abbildung 3-4: Die Datenaustauschphase [7].............................................................. 10 Abbildung 3-5: Die Abschlussphase [7] .......................................................................... 11 Abbildung 3-6: Der IP Header [8]...................................................................................... 12 Abbildung 3-7: Eigenschaften,Ereignisse und Methoden des Winsock-Objekts [6] .......................................................................................................................................... 13 Abbildung 4-1: Benutzeroberfläche des Server-Programms .................................. 26 Abbildung 4-2: Benutzeroberfläche des Clientprogramms...................................... 27 Abbildung 4-3: Verbindungsaufbau-Programmablaufplan ...................................... 28 Abbildung 4-4: Datenaustausch-Programmablaufplan (ServerÆ Client) .......... 29 Abbildung 4-5: Datenaustausch-Programmablaufplan (Client Æ Server)......... 30 Abbildung 4-6: Kommentierter Quellcode des Server-Programms...................... 31 Abbildung 4-7: Kommentierter Quellcode des Client-Programms ....................... 32 Abbildung 4-8: TCP-Einrichtungsphase, Synchronisationsaufforderung........... 33 Abbildung 4-9: TCP-Einrichtungsphase, Synchronisationsantwort ..................... 34 Abbildung 4-10: TCP-Einrichtungsphase, Synchronisationsbestätigung........... 35 Abbildung 4-11: TCP-Datenaustauschphase, Datenversand mit Bestätigungsaufforderung............................................................................................ 35 Abbildung 4-12: TCP-Datenaustauschphase, Empfangsbestätigung................... 36 Tabellenverzeichnis Tabelle 3-1: Einstellungen der Winsock-Protocol-Eigenschaft [6] ...................... 14 Tabelle 3-2: Einstellungen der Winsock-State-Eigenschaft [6]............................. 16 Tabelle 3-3: Einstellungen für die Winsock-Typ-Methode [6]................................ 21 Tabelle 3-4: Die Winsock-Fehlercodes [6] ..................................................................... 24 Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 4 1. Einleitung Der Trend hin zu vernetzten Fertigungen ist deutlich zu erkennen und nicht mehr aufzuhalten. In der Steuerungs- und Automatisierungstechnik setzt sich in diesem Zuge das Ethernet immer mehr durch. Oft werden dabei SPS1-Steuerungen über das Ethernet mit PC´s vernetzt. Der Transport von Daten über das Ethernet kann mit mehreren verschiedenen Protokollen vorgenommen werden, welche im ISO2/OSI3–Referenzmodell auf der vierten Schicht, der Transportschicht, zu finden sind. Die zwei bedeutendsten dieser Protokolle sind das TCP 4und das UDP 5Protokoll. Der wesentliche Unterschied besteht in der Verlässlichkeit der Protokolle. Beim TCP–Protokoll wird nach Erhalt eines Datenpaketes eine Bestätigung versendet. Diese Bestätigung gibt es beim UDP–Protokoll nicht, was dieses Protokoll unverlässlich macht. Aus diesem Grund ist bei Anwendungen mit geforderter Verlässlichkeit das TCP–Protokoll zu verwenden. 1 Speicherprogrammierbare Steuerungen 2 International Standards Organisation 3 Open System Interconnection 4 Transmission Control Protocol 5 User Datagram Protocol Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 5 2. Konkrete Aufgabenstellung Thema dieser Seminararbeit ist das Senden von TCP/IP6-Telegrammen aus einem Visual Basic (VB)-Programm. Die Ergebnisse dieses Projektes sollen Grundlage sein für das Vernetzen bzw. die Kommunikation von SPS-Steuerungen. Im ersten Schritt soll eine Möglichkeit gefunden werden um Telegramme aus einem VB-Programm über das Ethernet an ein VB-Programm auf einem anderen PC zu senden. Im zweiten Schritt soll kontrolliert werden, ob tatsächlich das TCP/IP – Protokoll verwendet wird und wie die übertragenen Daten im Protokoll dargestellt werden. 6 Internet Protocol Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 6 3. Grundlagen In diesem Kapitel werden die, für die Lösung der Aufgabenstellung benötigten, Grundlagen erklärt. 3.1 Das TCP/IP – Protokoll Das TCP/IP–Protokoll wird gerne als ein Protokoll verstanden. Tatsächlich sind es aber zwei Protokolle, das TCP–Protokoll und das IP–Protokoll. 3.1.1 Einordnung in das ISO/OSI - Referenzmodell „Das ab 1978 von der ISO entwickelte OSI Referenzmodell stellt einen (durchaus gelungenen) Versuch dar die Kommunikation zwischen Informationsverarbeitenden Endsystemen auf internationaler Ebene zu standardisieren. Die ISO beschreibt in ihrem OSI Standard ein 7 Schichten Modell, in dem jede Schicht (engl. Layer) seine eigenen speziellen Aufgaben wahrnimmt. Jede Schicht bietet ihren nächsten beiden Schichten, also der höher und der niedriger liegenden Schicht ein transparentes Interface an.“ [1] Das TCP–Protokoll ist im ISO/OSI–Referenzmodell auf der Schicht vier, der Transportschicht, das IP-Protokoll auf der Schicht drei, der Netzwerkschicht, angesiedelt (vgl. Abbildung 3-1). „Die Transportschicht ist für die zuverlässige Datenübermittlung zwischen zwei Kommunikationspartnern verantwortlich. Die Netzwerkschicht ist in erster Linie für das Routing zuständig.“ [3] Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 7 Abbildung 3-1: ISO OSI Referenzmodell [2] 3.1.2 Das TCP - Protokoll „TCP ist ein verbindungsorientiertes Transportprotokoll für den Einsatz in paketvermittelten Netzen. Das Protokoll baut auf dem IP-Protokoll auf, unterstützt die Funktionen der Transportschicht und stellt vor der Datenübertragung eine gesicherte Verbindung zwischen den Instanzen her. Die Daten der höheren Schichten werden durch TCP nicht verändert, sondern lediglich segmentiert und in einzelnen Datenpaketen versendet. Jedes Oktett (Anm. d. Verf.: Byte) eines Segments wird von TCP mit einer Sequenznummer versehen, um empfangsseitig die richtige Reihenfolge zu garantieren. Die wesentlichen Dienstleistungen, die das TCP-Protokoll in Verbindung mit dem IP-Protokoll für die Anwendungsprozesse bereitstellt, sind die Ende-zu-EndeKontrolle, das Verbindungs-Management, die Flusskontrolle, die Zeitkontrolle und das Multiplexen von Verbindungen sowie die Fehlerbehandlung.“ [4] Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 8 Die Abbildung 3-2 zeigt den Aufbau des TCP – Protokollkopfs. Abbildung 3-2: Der TCP Header [8] Auf ein ausführliche Beschreibung der Felder des TCP – Headers wird an dieser Stelle verzichtet, jedoch auf den Anhang verwiesen. 3.1.2.1 Die Phasen einer TCP-Verbindung [7] An einem Beispiel soll exemplarisch der Ablauf einer kompletten Datenübertragung auf TCP-Ebene gezeigt werden. Dazu wird dieser Ablauf in drei Phasen, die Einrichtungsphase (vgl. Abbildung 3-3), die Datenaustauschphase (vgl. Abbildung 3-4) und die Abschlussphase (vgl. Abbildung 3-5) eingeteilt. Die Einrichtungsphase Auf dem Sendesystem fordert eine Anwendung der höheren Schichten eine Verbindung zu einem entfernten System an und initiiert damit eine Verbindung auf TCP-Ebene. Die TCP-Implementierung erzeugt ein Segment und gibt es an die IPSchicht weiter, die daraus ein IP-Datagramm erzeugt. Im TCP-Segment ist das SYN-Flag gesetzt, um dem Empfänger-System zu signalisieren, dass sich die beiden Systeme auf die gültigen Sequenz- und Bestätigungsnummern einigen Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 9 müssen. Das Sende-System trägt seine aktuelle Sequenznummer in das Segment ein. Die Bestätigung darf nicht eingetragen werden. Das ACK-Flag wird nicht gesetzt. Das Empfänger-System antwortet mit einem TCP-Segment in dem das SYN- und das ACK-Flag gesetzt sind. Als Sequenznummer wird der eigene aktuelle Wert eingetragen. Die Bestätigungsnummer erhält den um Eins erhöhten Wert der Sequenznummer des gerade empfangenen Segments. Das SendeSystem bestätigt dieses Segment, indem das ACK-Flag gesetzt wird. Die Bestätigungsnummer enthält die erhöhte Sequenznummer des EmpfängerSystems. Damit ist die TCP-Verbindung eingerichtet und die Sequenznummern ausgetauscht. Beide Stationen sind jetzt bereit, die eigentlichen Daten auszutauschen. Sender Netz Empfänger SYN=153 ACK=? SYN 1 53 kein A CK SYN=321 ACK=154 K 154 21 AC 3 N Y S SYN=154 ACK=322 ACK 322 Zeit Abbildung 3-3: Die Einrichtungsphase [7] Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 10 Die Datenaustauschphase Um die Zuverlässigkeit einer Datenübertragung zu erhöhen, wird bei einer TCPVerbindung jedes gesendete Segment vom Empfänger bestätigt. Das folgende Beispiel zeigt das einfachste Szenario, dass bei einer Dateübertragung stattfinden kann. Netz Sender Die Daten „xx“ werden gesendet SEQ= 102 A CK=1 19 Empfänger Data= xx Empfang wird bestätigt 103 ACK= 9 1 1 SEQ= Zeit Abbildung 3-4: Die Datenaustauschphase [7] Der Sender sendet seine Daten an den Empfänger und erwartet ein BestätigungsSegment. Dabei wird am Sender ein Timer gestartet. Sollte die vorher festgelegt Zeitgrenze für dir Bestätigung überschritten werden, so werden die Daten vom Sender erneut gesendet. Nach dem Empfang des Datensegmentes bestätigt dies der Empfänger mit einem Segment welches ein leeres Datenfeld besitzt. Nachdem der Sender dieses Bestätigungssegment empfangen hat, ist die Datenübertragung abgeschlossen. Die Abschlussphase Möchte eines der beteiligten Systeme die bestehende Verbindung beenden, so initiiert es die Abschlussphase. Dabei sendet dieses System ein TCP-Segment in dem das FIN-Flag gesetzt ist. Das andere System bestätigt zuerst den Empfang mit einem Segment und antwortet dann mit einem zusätzlichen Segment, in dem Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 11 ebenfalls das FIN-Flag gesetzt ist. Auch dieses Segment muß vom Sender noch einmal bestätigt werden. Sender Netz Empfänger SEQ= 306 A CK=5 17 FIN 07 ACK 3 07 CK=3 517 A SEQ= FIN ACK =518 Zeit Abbildung 3-5: Die Abschlussphase [7] Die Verbindung wird nicht als geschlossen betrachte, solange nicht beide Systeme Segment, in denen das FIN-Flag gesetzt ist, gesendet und den Empfang der FINSegmente bestätigt haben. Falls in dieser Phase Segmente verloren gehen, wird die Verbindung nach Ablauf eines Timeout als getrennt betrachtet Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 12 3.1.3 Das IP – Protokoll „Die Aufgabe des Internet-Protokolls (IP) besteht darin, Datenpakete von einem Sender über mehrere Netze hinweg zu einem Empfänger zu transportieren. Die Übertragung ist paketorientiert, verbindungslos und nicht garantiert. IP garantiert weder die Einhaltung einer bestimmten Reihenfolge noch eine Ablieferung beim Empfänger. Empfangsquittungen gibt es auf IP-Schicht nicht. Die maximale Länge von IP-Datenpaketen ist auf 65.535 Bytes beschränkt. Da das Internet-Protokoll auf der Vermittlungsschicht aufsetzt und diese für das IP-Routing durch ein Netzwerk zuständig ist, erlaubt das Protokoll auch die Identifikation von Stationen anhand der IP-Adresse. Damit die Datenpakete nicht unendlich durch das Netz irren und dieses verkehrsmäßig belasten, hat der IPHeader ein Time-to-Live-Feld (TTL), in dem die Lebensdauer eines Datagramms festgelegt wird. Dieses Feld setzt die Zeitdauer fest, nach der ein Datenpaket verworfen wird.“ [4] Die Abbildung 3-6 zeigt den Header des IP – Protokolls. Abbildung 3-6: Der IP Header [8] Auf ein ausführliche Beschreibung der Felder des IP – Headers wird an dieser Stelle verzichtet, jedoch auf den Anhang verwiesen. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 13 3.2 Das Winsock – Objekt in Visual Basic Zur Lösung der Aufgabenstellung wird das Visual Basic–Steuerelement „Winsock“ verwendet. 3.2.1 Kurzbeschreibung: „Das Winsock-Steuerelement vereinfacht die Kommunikation zwischen PCs unter VB erheblich. Es fasst alle TCP/IP-Befehle der API 7von Windows in einem Control zusammen. Winsock beherrscht auch das Protokoll UDP.“ [5] In folgender Abbildung ist eine Übersicht über die Eigenschaften, Ereignisse und Methoden des Winsock – Objekts dargestellt. Eigenschaften BytesReceived LocalHostName LocalIP LocalPort Protocol RemoteHost RemoteHostIP RemotePort SocketHandle Ereignisse Close [Ereignis] Connect [Ereignis] ConnectionRequest DataArrival Error SendComplete SendProgress Methoden Accept Bind Close Connect GetData Listen PeekData SendData State Abbildung 3-7: Eigenschaften,Ereignisse und Methoden des Winsock-Objekts [6] 7 Application Programming Interface Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 14 3.2.2 Eigenschaften [104] In diesem Kapitel werden die verwendeten Eigenschaften des Winsock-Objekts beschrieben. Für Beschreibungen aller Eigenschaften des Winsock-Objekts wird auf den Anhang verwiesen. a) LocalPort (Long): Gibt den zu verwendenden lokalen Anschluß zurück oder legt diesen fest. Zur Entwurfszeit nicht verfügbar. b) Protocol: Gibt das Protokoll zurück oder legt dieses fest, entweder TCP oder UDP, daß vom Winsock-Steuerelement verwendet wird. Die möglichen Protokoll-Einstellungen sind in Tabelle 3-1 dargestellt. Konstante Wert Beschreibung sckTCPProtocol 0 Voreinstellung. TCP-Protokoll. sckUDPProtocol 1 UDP-Protokoll. Tabelle 3-1: Einstellungen der Winsock-Protocol-Eigenschaft [6] Anmerkung Da standardmäßig das TCP – Protokoll eingestellt ist, konnte auf die Verwendung dieser Eigenschaft verzichtet werden. c) RemoteHost (String): Gibt den Remote-Computer zurück, an den ein Steuerelement Daten sendet oder von dem es Daten erhält, oder legt ihn fest. Man kann entweder einen HostNamen bereitstellen, z.B. "FTP://ftp.microsoft.com", oder eine IPAdressenzeichenfolge im Format mit Punkten, wie z.B. "100.0.1.1". Anmerkungen: Wird diese Eigenschaft angegeben, so wird die URL-Eigenschaft aktualisiert, um den neuen Wert anzuzeigen. Diese Eigenschaft wird auch dann aktualisiert, um den neuen Wert wiederzugeben, wenn der Host-Bereich des URLs aktualisiert wird. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 15 Die RemoteHost-Eigenschaft kann auch durch den Aufruf der OpenURL- oder Execute-Methoden geändert werden. Zur Laufzeit hat die Änderung dieses Wertes keine Auswirkung bis zur nächsten Verbindung. d) RemoteHostIP (String): Gibt die IP-Adresse des Remote-Computers zurück. • Für Client-Anwendungen enthält diese Eigenschaft die IP-Zeichenfolge des Remote-Computers, nachdem eine Verbindung über die Connect-Methode eingerichtet wurde • Für Server-Anwendungen enthält diese Eigenschaft nach einer eingehenden Verbindungsanforderung (ConnectionRequest-Ereignis) die IP-Zeichenfolge des Remote-Computers, der die Verbindung hergestellt hat. • Bei Verwendung des UDP-Protokolls enthält diese Eigenschaft die IPAdresse des Rechners, der die UDP-Daten gesendet hat, nachdem das DataArrival-Ereignis aufgetreten ist. e) RemotePort (Long): Gibt die Netzanschlussnummer zurück oder stellt diese ein, mit der die Verbindung aufgebaut werden soll. Anmerkungen Wenn man die Protocol-Eigenschaft festlegt, wird die RemotePort-Eigenschaft automatisch auf den passenden Standardanschluss für jedes Protokoll festgelegt. f) State (Integer): Gibt den Status des Steuerelements als numerische Konstante zurück. Die Eigenschaft ist schreibgeschützt und zur Entwurfszeit nicht verfügbar. Die möglichen Einstellungen für die State-Eigenschaft sind in Tabelle 3-2 aufgeführt. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 16 Konstante Wert Beschreibung Voreinstellung. sckClosed 0 sckOpen 1 Geöffnet sckListening 2 Überwachen sckConnectionPending 3 Geschlossen Verbindung anstehend Host-Name wird sckResolvingHost 4 sckHostResolved 5 sckConnecting 6 Verbinden sckConnected 7 Verbunden sckClosing 8 sckError 9 aufgelöst Host-Name wurde aufgelöst Partner schließt die Verbindung Fehler Tabelle 3-2: Einstellungen der Winsock-State-Eigenschaft [6] 3.2.3 Ereignisse [6] In diesem Kapitel werden die verwendeten Ereignisse des Winsock-Objekts beschrieben. Für Beschreibungen aller Ereignisse des Winsock-Objekts wird auf den Anhang verwiesen. a) Close [Ereignis]: Tritt ein, wenn der Remote-Computer die Verbindung beendet. Anwendungen sollten die Close-Methode zur korrekten Beendigung einer TCP-Verbindung verwenden. Syntax: Winsock_Close () Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 17 b) Connect [Ereignis] Tritt auf, nachdem eine Verbindung zum Server aufgebaut wurde. Syntax: Winsock_Connect () Anmerkungen Man kann das Connect-Ereignis abfangen und jede Art von anfänglichen Abfragen durchführen, die für eine neue Verbindung erforderlich sind, zum Beispiel den Vergleich der Datenbankversion mit der Version des Clients oder die Einstellung einer Standard-Datenbank, die in der Verbindungszeichenfolge nicht angegeben ist. Man kann auch prüfen, ob während des Verbindungsaufbaus Fehler oder Meldungen zurückgegeben wurden, oder auch nur die Informationsmeldungen aus der rdoErrors-Auflistung (vgl. Tabelle 3-4) löschen. c) ConnectionRequest: Tritt ein, wenn ein Remote-Computer eine Verbindung anfordert. Nur für TCP-Server-Anwendungen. Das Ereignis tritt ein, wenn eine Verbindungsanforderung eingeht. Die Eigenschaften RemoteHostIP und RemotePort speichern die Informationen über den Client, nachdem das Ereignis aktiviert wurde. Syntax: Winsock_ConnectionRequest (AnforderungsID As Long) AnforderungsID: Der eingehende Bezeichner der Verbindungsanforderung. Dieses Argument sollte der Accept-Methode in der zweiten Steuerelementinstanz übergeben werden. Anmerkungen: Der Server kann entscheiden, ob die Verbindung akzeptiert wird oder nicht. Wird die eingehende Verbindung nicht akzeptiert, so erhält der Partner (Client) das Close-Ereignis. Um eine eingehende Verbindung zu akzeptieren, verwendet man die Accept-Methode (in einer neuen Steuerelementinstanz). d) DataArrival Tritt ein, wenn neue Daten ankommen. Syntax: Winsock_DataArrival (AnzahlBytes As Long) Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 18 AnzahlBytes Die Gesamtmenge der Daten, die abgerufen werden können. Anmerkungen: Dieses Ereignis tritt nicht ein, wenn man nicht alle Daten in einem einzigen GetData-Aufruf anfordert. Es wird nur ausgelöst, wenn neue Daten vorhanden sind. Um zu überprüfen wie viele Daten jeweils verfügbar sind verwendet man die BytesReceived-Eigenschaft e) Error: Tritt immer dann ein, wenn ein Fehler bei der Hintergrundverarbeitung auftritt (z.B. ein Verbindungsfehler oder ein Fehler beim Senden oder Abrufen von Daten im Hintergrund). Syntax: Winsock_Error(Zahl As Integer, Beschreibung As String, Scode As Long, Quelle As String, Hilfedatei as String, Hilfekontext As Long, AnzeigeAbbrechen As Boolean) Zahl Eine Ganzzahl, die den Fehler-Code angibt. (vgl. Tabelle 3-4) Beschreibung Eine Zeichenfolge, die den Fehler beschreibt. Scode Der SCODE. Quelle Eine Zeichenfolge, die die Fehlerquelle beschreibt. Hilfedatei Eine Zeichenfolge, die den Dateinamen einer Hilfedatei angibt. Hilfekontext Hilfekontext. AnzeigeAbbrechen Gibt an, ob die Anzeige abgebrochen werden soll. Die Voreinstellung ist False, d.h., das Standard-Fehlermeldungsfeld wird angezeigt. Wenn man das Standard-Meldungsfeld nicht verwenden nöchte, muss man AnzeigeAbbrechen auf True setzen. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 19 f) SendComplete: Tritt ein, wenn eine Senden-Operation beendet wurde Syntax: Winsock_SendComplete g) SendProgress: Tritt ein, während Daten gesendet werden. Syntax: Winsock_SendProgress (gesendeteBytes As Long, zuSendendeBytes As Long) gesendeteBytes Die Anzahl der Bytes, die seit der letzten Aktivierung dieses Ereignisses gesendet wurden. zuSendendeBytes Die Anzahl der Bytes im Puffer, die noch gesendet werden sollen. 3.2.4 Methoden [6] In diesem Kapitel werden die verwendeten Methoden des Winsock-Objekts beschrieben. Für Beschreibungen aller Methoden des Winsock-Objekts wird auf den Anhang verwiesen. a) Accept: Nur für TCP-Server-Anwendungen. Diese Methode wird dazu verwendet, eine eingehende Verbindung zu akzeptieren, während ein ConnectionRequest-Ereignis behandelt wird. Syntax: Winsock.Accept AnfrageID Anmerkungen Die Accept-Methode wird im ConnectionRequest-Ereignis verwendet. Das ConnectionRequest-Ereignis verfügt über ein entsprechendes Argument, den Parameter AnforderungsID, der an die Accept-Methode übergeben werden sollte. b) Close [Methode] Schließt eine TCP-Verbindung oder einen überwachenden Socket für Client- und Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 20 Server-Anwendungen. Syntax: Winsock.Close c) Connect [Methode] Stellt eine Verbindung zu einem Server her. Syntax: Winsock.Connect [RemoteHost], [RemotePort] d) RemoteHost IP-Adresse oder Hostname (wird automatisch aufgelöst) des Remote-Computers. e) RemotePort Legt die Netzanschlußnummer fest. Anmerkungen Wenn die Eigenschaften RemoteHost und RemotePort gesetzt wurden, können die Argumente weggelassen werden. f) GetData: Ruft den aktuellen Datenblock ab und speichert diesen in einer Variablen vom Typ Variant. Syntax: Winsock.GetData Daten, [Typ,] [maxLänge] Daten Enthält die abgerufenen Daten, nachdem die Methode erfolgreich zurückgegeben wurde. Sind nicht genügend Daten für den angeforderten Typ verfügbar, so wird Daten auf Empty gesetzt. Typ Optional. Typ der abzurufenden Daten, wie unter Einstellungen (vgl.Tabelle 3-3) beschrieben. maxLänge Optional. Gibt die gewünschte Größe an, wenn ein Byte-Datenfeld oder eine Zeichenfolge abgerufen wird. Fehlt dieses Argument für ein ByteDatenfeld oder eine Zeichenfolge, so werden alle verfügbaren Daten Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 21 abgerufen. Wird dieses Argument für andere Datentypen als ByteDatenfelder und Zeichenfolgen bereitgestellt, so wird es ignoriert. Datentyp Konstante Byte vbByte Integer vbInteger Long vbLong Single vbSingle Double vbDouble Currency vbCurrency Date vbDate Boolean vbBoolean Long (Fehler-Code) vbError String vbString Byte-Datenfeld vbArray + vbByte Tabelle 3-3: Einstellungen für die Winsock-Typ-Methode [6] Anmerkungen Gewöhnlich wird die GetData-Methode mit dem DataArrival-Ereignis verwendet, welches das Argument AnzahlBytes beinhaltet. Wenn man eine maxLänge kleiner als AnzahlBytes angeben, erhält man die Warnung 10040, die angibt, daß die verbleibenden Bytes verlorengehen. g) Listen Erstellt einen Socket und setzt diesen in den Überwachen-Modus. Diese Methode funktioniert nur bei TCP-Verbindungen. Die Eigenschaft LocalPort sollte zuerst gesetzt werden. Syntax: Winsock.Listen Anmerkungen Das ConnectionRequest-Ereignis tritt ein, wenn eine Verbindung angefordert wird. Bei der Behandlung des ConnectionRequest-Ereignisses sollte die Anwendung Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 22 die Accept-Methode verwenden (in einer neuen Instanz des Steuerelements), um die Verbindung zu akzeptieren. h) SendData: Sendet Daten an einen Remote-Computer. Syntax: Winsock.SendData Daten i) Daten Zu sendende Daten. Für binäre Daten sollten Byte-Datenfelder verwendet werden. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 23 j) Die Winsock - Fehlercodes In der Tabelle 3-4 sind die möglichen Fehlercodes des Winsock-Objekts dargestellt. Konstante Wert Beschreibung sckOutOfMemory 7 Nicht genügend Speicher sckInvalidPropertyValue 380 Der Eigenschaftswert ist ungültig sckGetNotSupported 394 Die Eigenschaft kann nicht gelesen werden sckSetNotSupported 383 Die Eigenschaft ist schreibgeschützt sckBadState 40006 Falsches Protokoll oder falscher Verbindungszustand für die angeforderte Transaktion oder Anforderung Das an eine Funktion übergebene Argument war nicht im sckInvalidArg 40014 richtigen Format oder hatte keinen Wert im angegebenen Bereich sckSuccess 40017 Erfolgreich sckUnsupported 40018 Nicht unterstützter Variant-Typ sckInvalidOp 40020 Ungültige Operation für den aktuellen Zustand sckOutOfRange 40021 Argument liegt außerhalb des zulässigen Bereichs sckWrongProtocol 40026 sckOpCanceled 1004 Die Operation wurde abgebrochen sckInvalidArgument 10014 sckWouldBlock 10035 sckInProgress 10036 sckAlreadyComplete 10037 sckNotSocket 10038 Der Deskriptor ist kein Socket sckMsgTooBig 10040 sckPortNotSupported 10043 Der angegebene Anschluß wird nicht unterstützt sckAddressInUse 10048 Adresse wird bereits verwendet sckAddressNotAvailable 10049 Adresse steht vom lokalen Computer aus nicht zur Verfügung Falsches Protokoll für die angeforderte Transaktion oder Anforderung Die angeforderte Adresse ist eine Broadcast-Adresse, aber das Attribut wurde nicht gesetzt Socket erlaubt keine Blockierungen, und die angegebene Operation hat eine Blockierung zur Folge Momentan wird eine blockierende Winsock-Operation ausgeführt Die Operation ist abgeschlossen. Momentan wird keine blockierende Operation durchgeführt Das Datagramm ist zu groß für den Puffer und wird abgeschnitten sckNetworkSubsystemFailed 10050 Netzwerk-Subsystem fehlgeschlagen sckNetworkUnreachable 10051 Das Netzwerk ist von diesem Host aus zur Zeit nicht erreichbar Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 24 Zeitüberschreitung für Verbindung, wenn SO_KEEPALIVE sckNetReset 10052 sckConnectAborted 11053 sckConnectionReset 10054 Die Verbindung wurde vom Remote-Computer zurückgesetzt sckNoBufferSpace 10055 Kein Pufferspeicher verfügbar sckAlreadyConnected 10056 Socket ist bereits verbunden sckNotConnected 10057 Socket ist nicht verbunden sckSocketShutdown 10058 Socket wurde heruntergefahren sckTimedout 10060 Socket hat eine Zeitüberschreitung verursacht sckConnectionRefused 10061 Herstellen der Verbindung wird absichtlich verweigert sckNotInitialized 10093 WinsockInit muß zuerst aufgerufen werden sckHostNotFound 11001 Autorisierte Antwort: Host nicht gefunden gesetzt ist Verbindung wurde aufgrund einer Zeitüberschreitung oder eines anderen Fehlers getrennt sckHostNotFoundTryAgain 11002 Nicht autorisierte Antwort: Host nicht gefunden sckNonRecoverableError 11003 Nicht behebbare Fehler; Fortsetzung nicht möglich sckNoData 11004 Gültiger Name; kein Datensatz des angeforderten Typs Tabelle 3-4: Die Winsock-Fehlercodes [6] Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 25 4. Lösung der Aufgabenstellung Wie in der Aufgabenstellung (vgl. Kapitel 2) erwähnt, ist die Aufgabe in zwei Teile untergliedert: • Senden von TCP/IP – Telegrammen aus einem Visual Basic – Programm • Analyse der Protokolle des Datenverkehrs Zur Realisierung wurden folgende Geräte und Programme benutzt • 1 Laptop, Betriessystem WinXP, 2,2 GHz – Prozessor, 512 MB RAM, incl. einer PCMCIA-Wlan Karte, IP-Adresse 192.168.1.10; im folgenden als PC1 bezeichnet. • 1 Laptop, Betriebssystem Win2000, 400MHz – Prozessor, 192 MB RAM, incl. einer PCMCIA-Wlan Karte, IP-Adresse 192.168.1.11; im folgenden als PC2 bezeichnet. • 1 Wlan-Switch, 11mBits/s, Marke DrayTek • Das Programm Visual Basic Studio zur Erstellung der benötigten Visual Basic Programme. Installiert auf dem PC1. • Das Programm EtheReal zur Analyse des Datenflusses Netzwerkverkehres. Installiert auf dem PC2. Anmerkung: Die Datei mswinsck.ocx musste auf dem PC2 noch in das Verzeichnis C:\Winnt\system32 kopiert werden. Dazu wurde die Datei aus dem Internet heruntergeladen. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 26 4.1 Senden von TCP/IP – Telegrammen aus Visual Basic Zum Senden der Telegramme wurden zwei Programme in Visual Basic erstellt. Das eine wird im folgenden als Server – Programm, das andere als Client – Programm bezeichnet. Das Server – Programm wird auf PC1 ausgeführt, das Client – Programm auf PC2. Die Funktion der Programme besteht darin, einen, in ein Eingabefeld eingegebenen, Text über das Ethernet in das Textausgabefeld des anderen Programms, auf dem anderen PC, zu schreiben. 4.1.1 Die Benutzeroberflächen Zur Ein- und Ausgabe des Textes haben beide Programme eine Benutzeroberfläche, welche in den beiden folgenden Abbildungen dargestellt sind. (vgl. Abbildungen 4-1 und 4-2) Textausgabefeld Texteingabefeld Abbildung 4-1: Benutzeroberfläche des Server-Programms Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 27 Textausgabefeld Texteingabefeld Abbildung 4-2: Benutzeroberfläche des Clientprogramms Gibt der Anwender des Serverprogramms einen Text in sein Eingabefeld ein und betätigt dann den „Senden“-Button wird der Text an das Client-Programm, auf der Client-Seite, übertragen. In diesem Client-Programm wird der Text in das Textausgabefeld geschrieben. Um die Kommunikation nachvollziehen zu können, wird der Text auch im Textausgabefeld des Server-Programms angezeigt. Nach dem gleichen Prinzip funktioniert auch der Text-Versand vom ClientProgramm zum Server-Programm. 4.1.2 Programmablaufpläne Die Aufgaben der Programme lassen sich in drei Bereiche aufteilen: • Verbindungsaufbau (vgl. Abbildung 4-3) • Text von Server/Client an Client/Server senden (vgl. Abbildungen 4-4 und 4-5) • Text von Client bzw. Server empfangen (vgl. Abbildungen 4-4 und 4-5) Zur Umsetzung dieser Aufgaben wird insbesondere das Winsock – Objekt (siehe Kapitel 3.2) benutzt. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 28 In den folgenden drei Programmablaufplänen wird der Einsatz des Winsock – Objektes, seiner Eigenschaften, seiner Ereignisse und seiner Methoden dargestellt. 4.1.2.1 Verbindungsaufbau In diesem Programmablaufplan (vgl. Abbildung 4-3) ist der Verbindungsaufbau zwischen den beiden Programmen dargestellt, sowie die Ausgaben in den jeweiligen Textausgabefeldern SrvEtxt und CltEtxt. Programmablaufplan Client – Seite (PC2) Server – Seite (PC1) Server-Programm starten Form_Load() ¾ Winsock.LocalPort = „85“ Verbindungsaufbau ¾ WinSock.Listen ¾ SrvEtxt.Text = „Winsock initialiert“ ¾ SrvEtxt.SelStart = Len(SrvEtxt.Text) Client-Programm starten Form_Load() ¾ Winsock.RemoteHost = „192.168.1.10“ ¾ WinSock.RemotePort = „85“ ¾ Wincok.Connect ¾ CltEtxt.Text = „Winsock initialisiert Winsock_ConnectionRequest(ByVal request ID as Long) ¾ Winsock.Close Winsock_Connect() ¾ WinSock.Accept requestID ¾ CltEtxt.Text = CltEtxt.Text & vbCrlf & „Client verbunden mit Server“ Legende - Eigenschaften - Ereignisse - Methoden Abbildung 4-3: Verbindungsaufbau-Programmablaufplan Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 29 4.1.2.2 Textversand von Server an Client In diesem Programmablaufplan (siehe Abbildung 4-4) ist das Senden von Text vom Serverprogramm zum Clientprogramm dargestellt, sowie die Ausgaben in den jeweiligen Textausgabefeldern SrvEtxt und CltEtxt. Programmablaufplan Text von Server an Client senden Client – Seite (PC2) Server – Seite (PC1) Text im Eingabefenster eingeben und auf „senden“ drücken SrvSenden_Click() ¾ if Winsock.State <> 0 And Winsock.Stat <> 2 then ¾ SrvEtxt.text = SrvEtxt & vbCrlf & „Server:“ & SrvStxt.Text ¾SrvEtxt.SelStart = Len (SrvEtxt.Text) Winsock_DataArrival (ByVal bytesTotal as Long) ¾ Dim Daten as String ¾WinSock.SendData SrvStxt.Text ¾SrvStxt.Text = „“ ¾ Winsock.GetData Daten ¾ CltEtxt.Text = CltEtxt.Text & vbCrlf & „Server (“ & Winsock.RemoteHost & „) : & Daten ¾ CltEtxt.SelStart = Len(CltEtxt.Text) Legende - Eigenschaften - Ereignisse - Methoden Abbildung 4-4: Datenaustausch-Programmablaufplan (ServerÆ Client) Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 30 4.1.2.3 Textversand von Client an Server In diesem Programmablaufplan (siehe Abbildung 4-5) ist das Senden von Text vom Clientprogramm zum Serverprogramm dargestellt, sowie die Ausgaben in den jeweiligen Textausgabefeldern SrvEtxt und CltEtxt. Programmablaufplan Text von Client an Server senden Client – Seite (PC2) Server – Seite (PC1) Text im Eingabefenster eingeben und auf „senden“ drücken CltSenden_Click() ¾ if Winsock.State <> 0 And Winsock.State <> 2 then ¾ CltEtxt.text = CltEtxt & vbCrlf & „Client:“ & CltStxt.Text ¾CltEtxt.SelStart = Len (CltEtxt.Text) ¾WinSock.SendData CltStxt.Text Winsock_DataArrival (ByVal bytesTotal as Long) ¾CltStxt.Text = „“ ¾ Dim Daten as String ¾ Winsock.GetData Daten ¾ SrvEtxt.Text = SrvEtxt.Text & vbCrlf & „Client (“ & Winsock.RemoteHostIP & „) : & Daten ¾ SrvEtxt.SelStart = Len(SrvEtxt.Text) Legende - Eigenschaften - Ereignisse - Methoden Abbildung 4-5: Datenaustausch-Programmablaufplan (Client Æ Server) 4.1.3 Der Quellcode In diesem Kapitel sind die Quellcodes der beiden Programme kommentiert dargestellt. (vgl. Abbildungen 4-6 und 4-7) Bei der Programmierung der Bedienoberflächenformulare ist darauf zu achten, dass man in diese das Winsock-Steuerelement einbettet. Zu finden ist das Steuerelement im Menü Æ Projekt Æ Komponenten Æ Register „Steuerelement“. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 31 In diesem Register „Microsoft Winsock Control 6.0“ auswählen und mit OK bestätigen. Im nächsten Schritt muss das Winsock-Icon, welches nun in der Steuerelement-Toolbox zu finden ist, auf das Formular per „Drag & Drop“ gezogen werden. Abbildung 4-6: Kommentierter Quellcode des Server-Programms In der Abbildung 4-6 ist der Quellcode des Serverprogrammes dargestellt. Die Kommentare der einzelnen Befehle sind in grüner Schrift. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 32 Abbildung 4-7: Kommentierter Quellcode des Client-Programms In der Abbildung 4-7 ist der Quellcode des Clientprogrammes dargestellt. Die Kommentare der einzelnen Befehle sind in grüner Schrift. Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 33 4.2 Die Protokollanalyse mit „Ethereal“ Der zweite Teil der Aufgabenstellung ist die Analyse des Datenverkehres beim Senden eines Textes. Dazu wird auf dem PC2 das Programm Ethereal („The Ethereal Network Analyzer“) installiert. Mit Hilfe dieses Programms kann der Verkehr auf dem Netzwerk aufgezeichnet und anschließend betrachtet werden. Für das Aufbauen der Verbindung zwischen den beiden Programmen bzw. PC´s und das Senden des Textes „hallo fabian“ ist in den Abbildungen 4-8 bis 4-12 der Datenverkehr auf dem Netzwerk dargestellt Abbildung 4-8: TCP-Einrichtungsphase, Synchronisationsaufforderung In Abbildung 4-8 ist der Beginn der Einrichtungsphase (vgl. Kapitel 3.1.2.1) dargestellt. Diese wird durch den Programmstart des Clients begonnen. Der Client Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 34 sendet dabei ein TCP-Segment in dem das SYN-Flag gesetzt und das ACK-Flag nicht gesetzt ist. Abbildung 4-9: TCP-Einrichtungsphase, Synchronisationsantwort In Abbildung 4-9 ist Antwort des Serverprogramms auf die Synchronisationsaufforderung des Clientprogramms dargestellt. Hierbei antwortet der Server mit einem TCP-Segment in dem das SYN- und das ACK-Flag gesetzt sind. (vgl. Kapitel 3.1.2.1) In Abbildung 4-10 ist die Bestätigung des soeben erhaltenen TCP-Segments dargestellt. Zur Bestätigung ist in diesem TCP-Segment das ACK-Flag gesetzt. Damit ist die TCP-Verbindung eingerichtet und die Synchronisation abgeschlossen. (vgl. Kapitel 3.1.2.1) Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 35 Abbildung 4-10: TCP-Einrichtungsphase, Synchronisationsbestätigung Abbildung 4-11: TCP-Datenaustauschphase, Datenversand mit Bestätigungsaufforderung In Abbildung 4-11 ist der Beginn der Datenaustauschphase dargestellt. Der Client sendet das TCP-Segment mit den Daten zum Server und erwartet dann eine Empfangsbestätigung des Servers (vgl. Abbildung 4-12). Die Daten (hier: der Text Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 36 „hallo fabian“) sind in der Abbildung 4-11 rot unterstrichen. Der Datenblock ist 12 Bytes groß (11 Buchstaben und eine Leerzeichen) und, wie in der linken Seite der Abbildung zu sehen, hexadezimal dargestellt. Abbildung 4-12: TCP-Datenaustauschphase, Empfangsbestätigung In Abbildung 4-12 ist das TCP-Segment mit der Empfangsbestätigung des Servers dargestellt. Hat der Client dieses TCP-Segment empfangen, ist die Datenübertragung abgeschlossen. (vgl. Kapitel 3.1.2.1) Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 37 Literaturhinweise [1] Daniel Baulig: ISO OSI Referenzmodell http://ip-web.hn.org/osi-referat/ (eingesehen am 08.12.2003) [2] N.N. Das ISO/OSI Refernmodell www.fh-wedel.de (eingesehen am 07.11.2003) [3] N.N. Schichtenmodelle http://www.tecchannel.de/tecspecial1/artikel/so_funktioniert_tcp_ip/0.html (eingesehen am 08.12.2003) [4] N.N. Siemens AG Lexikon www.siemens.de (eingesehen am 08.12.2003) [5] N.N. VB – Magazin: Der Anfänger-Guide zu Visual Basic http://www.vb-magazin.de/new/contentid-66.html (eingesehen am 08.12.2003) [6] N.N. VB – Magazin: Der Anfänger-Guide zu Visual Basic http://www.vb-magazin.de/new/contentid-69.html (eingesehen am 08.12.2003) [7] Volker Schüppel Entwicklung einer Client-/Server-Applikation zum Informationsaustausch von Systemdaten zwischen entfernten Systemen, 1999 RVHR-Universität Bochum, Diplomarbeit http://www.etdv.ruhr-uni-bochum.de/dv/diplomarbeiten/d341/d341.pdf (eingesehen am 10.12.2003) Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm 38 [8] Heiko Holtkamp Einführung in TCP/IP Technische Fakultät, Universität Bielefeld http://www.rvs.uni-bielefeld.de/~heiko/tcpip/kap_2_3.html#ip (eingesehen am 10.12.2003) Senden von TCP/IP Telegrammen aus einem Visual Basic-Programm