TCPIPProgrammierung 11 Windows Winsock Sockets in anderen Sprachen

  • Slides: 25
Download presentation
TCP/IP-Programmierung 11 Windows Winsock, Sockets in anderen Sprachen Hochschule Fulda – FB AI Wintersemester

TCP/IP-Programmierung 11 Windows Winsock, Sockets in anderen Sprachen Hochschule Fulda – FB AI Wintersemester 2017/18 http: //tp. rz. hs-fulda. de Peter Klingebiel, HS Fulda, FB AI

? ? ? 1 • Was ist das? Was passiert hier? #!/bin/bash while :

? ? ? 1 • Was ist das? Was passiert hier? #!/bin/bash while : do (echo 'HTTP/1. 1 200 OKrn' | cat file) | nc –l –p 4711 done TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 2

Winsock 1 • die bekannten Berkeley-Sockets sind fast eins-zu-eins auch in Microsoft Windows in

Winsock 1 • die bekannten Berkeley-Sockets sind fast eins-zu-eins auch in Microsoft Windows in der Winsock-API implementiert und bekannt • die wesentlichen Unterschiede: – einige Datentypen – Initialisierung von Winsock – Fehlerhandling • damit sind viele Socket-Programme relativ problemlos auch auf Windows zu portieren • dennoch: im Detail viele kleinere und größere Unterschiede zur Berkeley Socket-API … • … und einige Windows-spezifische Erweiterungen TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 3

Winsock 2 • Initialisierung der Winsock-Library #include<winsock 2. h> #pragma comment(lib, "ws 2_32. lib")

Winsock 2 • Initialisierung der Winsock-Library #include<winsock 2. h> #pragma comment(lib, "ws 2_32. lib") int main(int argc, char **argv) { WSADATA wsa; // Winsock Datenstruktur . . . // Winsock Library initialisieren / starten if(WSAStartup(MAKEWORD(2, 2), &wsa) != 0) // Fehler . . . // Winsock Library beenden WSACleanup(); return 0; } TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 4

Winsock 3 • Initialisierung der Winsock-Library int WSAStartup(WORD vers, LPWSADATA wsa); • vers: Winsock-Version

Winsock 3 • Initialisierung der Winsock-Library int WSAStartup(WORD vers, LPWSADATA wsa); • vers: Winsock-Version • wsa: Pointer auf eine WSADATA-Datenstruktur • die Winsock-Version wird i. d. R. mit dem Makro WORD(major, minor) angelegt, wobei major die Major-Releasenummer, minor die Minor-Releasenummer der Winsock-Version angibt, • im Beispiel Winsock Version 2. 2 WORD(2, 2) • liefert 0, wenn alles OK ist, sonst Fehler • Fehler kann mit WSAGet. Last. Error()ermittelt werden • Beenden der Winsock-Library int WSACleanup(); TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 5

Winsock 4 • Datentyp für Socket-Filehandle: SOCKET • typisches Gerüst für Winsock Serverprogramm: WSADATA

Winsock 4 • Datentyp für Socket-Filehandle: SOCKET • typisches Gerüst für Winsock Serverprogramm: WSADATA wsa; SOCKET sock; sockaddr_in addr; . . . WSAStartup(WORD(2, 2), &wsa); // Winsock starten sock = socket(AF_INET, SOCK_STREAM, 0) addr. sin_family = AF_INET; . . . bind(sock, . . . ); listen(sock, . . . ); accept(sock, . . . ); . . . closesocket(sock); WSACleanup(); // Winsock beenden • entsprechend auch für Clientprogramm TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 6

Sockets in Perl 1 • Perl ist eine sehr verbreitete freie Sprache für viele

Sockets in Perl 1 • Perl ist eine sehr verbreitete freie Sprache für viele Plattformen, die seit 1987 insbesondere im Unix-/Linux. Umfeld für administrative Aufgaben eingesetzt wird • Eigenschaften von Perl u. a. – freie Skript- / Interpretersprache – vereint Elemente aus C, Shell, AWK und einer Reihe anderer Programmiersprachen – verschiedene Paradigmata: insbesondere strukturierte Programmierung und Objektorientierung (seit Perl 5) – hervorragend zur Textverarbeitung geeignet – schnelle Entwicklung von Programmen möglich • Kritik an Perl: oft nur schwer lesbar und von den Konzepten her ein wenig in die Jahre gekommen … TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 7

Sockets in Perl 2 Perl Socket API fast Berkeley-Socket API socket Server fordert Socket

Sockets in Perl 2 Perl Socket API fast Berkeley-Socket API socket Server fordert Socket an bind Server legt Port fest listen Server bereit accept Server wartet recv Server liest send Server schreibt close Server beendet Verbindung Client fordert Socket an Client stellt Verbindung her Daten (Anforderung) Daten (Antwort) Client beendet Verbindung TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI socket connect send recv close 8

Sockets in Perl 3 • Perl: Socket-API auf Interpretersprache angepasst • TCP-IPv 4 -Server-Socket

Sockets in Perl 3 • Perl: Socket-API auf Interpretersprache angepasst • TCP-IPv 4 -Server-Socket erzeugen socket(SOCKET, PF_INET, SOCK_STREAM, (getprotobyname('tcp'))[2]); • Server-Socket an Adresse binden bind(SOCKET, pack_sockaddr_in($server_port, inet_aton($server_name))); • Server-Socket auf Empfang schalten listen(SOCKET, 5); • auf Clientverbindungen warten $client_addr = accept(NEW_SOCKET, SOCKET); • Kommunikation mit Client • Socket schliessen close NEW_SOCKET; TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 9

Sockets in Perl 4 • TCP-IPv 4 -Client-Socket erzeugen socket(SOCKET, PF_INET, SOCK_STREAM, (getprotobyname('tcp'))[2]); •

Sockets in Perl 4 • TCP-IPv 4 -Client-Socket erzeugen socket(SOCKET, PF_INET, SOCK_STREAM, (getprotobyname('tcp'))[2]); • Zum Server verbinden connect(SOCKET, pack_sockaddr_in($server_port, inet_aton($server_name)); • Kommunikation mit Server • Socket schliessen close SOCKET; • es wird deutlich: Perl Socket-API ist sehr eng an die CSocket-API angelehnt • mit Perl sind sehr schnell TCP/IP-Programme oder ihre Prototypen entwickelt • quick and dirty (? ) TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 10

Sockets in Perl 5 • Objektorientierte Sockets in Perl • TCP-IPv 4 -Server-Socket erzeugen,

Sockets in Perl 5 • Objektorientierte Sockets in Perl • TCP-IPv 4 -Server-Socket erzeugen, binden und auf Empfang stellen my $socket = new IO: : Socket: : INET ( Local. Host => $server_name, Local. Port => $server_port, Proto => 'tcp', Listen => 5 Reuse => 1 ); • auf Clientverbindungen warten $client_socket = $socket->accept(); • Kommunikation mit Client • Client-Socket schliessen $client_socket->close(); TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 11

Sockets in Perl 6 • Objektorientierte Sockets in Perl • TCP-IPv 4 -Client-Socket erzeugen

Sockets in Perl 6 • Objektorientierte Sockets in Perl • TCP-IPv 4 -Client-Socket erzeugen und verbinden my $socket = new IO: : Socket: : INET ( Peer. Host => $server_name, Peer. Port => $server_port, Proto => 'tcp', ); • Kommunikation mit Server $socket->send($data); $socket->recv($data, 1024); • Client-Socket schliessen $client_socket->close(); • damit wird die Erstellung von TCP/IP-Programmen noch einmal deutlich einfacher und effizienter TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 12

Sockets in Python 1 • Python ist eine universelle, meist interpretierte höhere freie Programmiersprache

Sockets in Python 1 • Python ist eine universelle, meist interpretierte höhere freie Programmiersprache • enstanden 1991, seit mehreren Jahren auf sehr vielen Plattformen (auch μC) verfügbar und auf dem Vormarsch • für universelle Anwendungen, u. a. TCP/IP-Programme • Eigenschaften von Python u. a. – vereint verschiedene Paradigmata: objektorientierte, aspektorientierte, funktionale Programmierung u. a. m. – klare, übersichtliche Syntax – leicht erlernbar – Besonderheit: Einrückungen statt Klammern – einfache und schnelle Entwicklung von Programmen TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 13

Sockets in Python 2 • Python-Socketpaket importieren import socket • Server-Socket erzeugen servsock =

Sockets in Python 2 • Python-Socketpaket importieren import socket • Server-Socket erzeugen servsock = socket() • Server-Socket an Adresse binden servsock. bind(server_name, server_port) • Server-Socket auf Empfang schalten servsock. listen(5) • Client-Verbindung annehmen clientsock, clientaddr = servsock. accept() • Kommunikation mit Client • Client-Socket schliessen clientsock. close() TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 14

Sockets in Python 3 • Client: Socket erzeugen sock = socket() • Client: Socket

Sockets in Python 3 • Client: Socket erzeugen sock = socket() • Client: Socket mit Server verbinden sock. connect(server_name, server_port) • Kommunikation mit Server sock. send(bytesdata) bytesdata = sock. recv(nbytes) • Kommunikationsparameter: Datentyp bytes • Socket schliessen sock. close() • höhere Elemente (z. B. Server) werden angeboten • Python erlaubt auf einfache und klare Weise, TCP/IPAnwendungen zu entwickeln und auf vielen Plattformen einzusetzen TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 15

Sockets in Java 1 • auch Java bietet eine relativ einfache Schnittstelle zur Socketprogrammierung

Sockets in Java 1 • auch Java bietet eine relativ einfache Schnittstelle zur Socketprogrammierung an • Java unterscheidet dabei zwischen Sockets, d. h. meist Client-Sockets und Server-Sockets • für Sockets Klasse java. net. Socket • für Server-Sockets Klasse java. net. Server. Socket • Import der java. net- und java. io-Klassen import java. net. *; import java. io. *; • Erzeugen eines Socket und Verbindungsaufbau Socket sock = new Socket(host, port); • host: Hostname oder IP-Adresse • port: Port TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 16

Sockets in Java 2 • hierbei sollte die Exception Unknown. Host. Exception behandelt werden

Sockets in Java 2 • hierbei sollte die Exception Unknown. Host. Exception behandelt werden try { Socket sock = new Socket(host, port); // ok } catch(Unknown. Host. Exception e) { // Exception behandeln } • Schliessen des Socket sock. close(); • Kommunikation über Kanäle der java. io-Klassen Print. Writer out = new Print. Writer( sock. get. Output. Stream(), true); Buffered. Reader in = new Buffered. Reader( new Input. Stream. Reader(sock. get. Input. Stream())); • ; TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 17

Sockets in Java 3 • typischer Ablauf einer Client-Socketverbindung // Socket instantiieren und mit

Sockets in Java 3 • typischer Ablauf einer Client-Socketverbindung // Socket instantiieren und mit Server verbinden try { Socket sock = new Socket(host, port); . . . // IO-Kanaele fuer Kommunikation instantiieren Print. Writer out =. . . Buffered. Reader in =. . . // mit Server kommunizieren . . . out. println(. . . ); data = in. read. Line(); } // Exceptions abfangen und behandeln catch(Unknown. Host. Exception e) {. . . } catch(IOException e) {. . . } // Socket schliessen sock. close(); TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 18

Sockets in Java 4 • die Server-Seite folgt ebenfalls dem üblichen Ablauf • Erzeugen

Sockets in Java 4 • die Server-Seite folgt ebenfalls dem üblichen Ablauf • Erzeugen eines Server-Socket Server. Socket servsock = new Server. Socket(port); • port: Port des Serverdienstes • Annehmen einer Clientverbindung clientsock = servsock. accept(); • • • Anlegen der Kommunikationsobjekte Kommunikation mit Client Schliessen des Client-Socket am Ende Schliessen des Server-Socket darüberhinaus bietet Java einige mehr Funktionalitäten Java bietet eine Socket-Schnittstelle zur relativ einfachen Programmierung von TCP/IP-Anwendungen TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 19

Sockets in PHP 1 • PHP ist eine höhere freie Programmiersprache, die interpretierend abgearbeitet

Sockets in PHP 1 • PHP ist eine höhere freie Programmiersprache, die interpretierend abgearbeitet wird • enstanden 1995 speziell für Webandwendungen • Syntax start an C und Perl angelehnt • i. d. R. verwendet für dynamische Webseiten und z. T. sehr komplexe Web- und Web-DB-Anwendungen • Eigenschaften von PHP u. a. – vereint verschiedene Paradigmata: objektorientierte, strukturierte, funktionale Programmierung u. a. m. – klare, übersichtliche Syntax – leicht erlernbar – einfache und schnelle Entwicklung von Anwendungen, insbesondere für das Web TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 20

Sockets in PHP 2 • PHP bietet eine umfangreiche Socket-Schnittstelle, die Berkekey Socket-Schnittstelle relativ

Sockets in PHP 2 • PHP bietet eine umfangreiche Socket-Schnittstelle, die Berkekey Socket-Schnittstelle relativ weit umsetzt • die wichtigsten Funktionen • Server-Socket erzeugen $sock = socket_create(domain, type, protocol); • Server-Socket an Adresse binden socket_bind(socket, address [, port]); • Server-Socket auf Empfang schalten socket_listen(socket [, backlog]) • Client-Verbindung annehmen clientsock = socket_accept(socket); • Socket schliessen socket_close(socket); TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 21

Sockets in PHP 3 • Client: Socket mit Server verbinden socket_connect(socket, address [, port]);

Sockets in PHP 3 • Client: Socket mit Server verbinden socket_connect(socket, address [, port]); • IO-Funktionen socket_read(socket, length [, type]); socket_write(socket, buffer [, length]); socket_send(socket, buf, len, flags); socket_recv(socket, buf, len, flags); • entsprechend werden auch die anderen IO-Funktionen der Socket-API von PHP angeboten • Serverablauf wie üblich socket_create() - socket_bind() - socket_listen() – socket_accept() – socket-IO - socket_close() • Clientablauf wie üblich socket_create() - socket_connect() – socket-IO - socket_close() TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 22

Web. Sockets 1 • Web. Sockets ist ein auf TCP-aufsetzendes Protokoll, das in Webanwendungen

Web. Sockets 1 • Web. Sockets ist ein auf TCP-aufsetzendes Protokoll, das in Webanwendungen eine bidirektionale Verbindung zwischen Server und Client realisiert • Kommunikation zwischen Server und Client wird damit effizienter, schneller und billiger • im Gegensatz zu HTTP wird eine Verbindung Server. Client nicht bei jeder Aktion / jedem Request, sondern nur einmal vom Client aufgebaut • auch die üblichen HTTP-Header sind nicht notwendig • URI-Schemata: ws: (Web. Sockets), wss: (veschlüsselt) • auf Server-Seite: Web. Sockets sind z. B. in PHP oder Java. Script realisiert • Clients: die meisten Browser unterstützen Web. Sockets TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 23

Web. Sockets 2 • Beispiel in Java. Script mit Webserver auf Port 80 und

Web. Sockets 2 • Beispiel in Java. Script mit Webserver auf Port 80 und Web. Sockets-Server auf Port 81 auf ESP 8266 • Web. Socket-Server auf Port 81 erzeugen var connection = new Web. Socket('ws: //' + location. hostname + ': 81/', ['arduino']); connection. onopen = function() {. . . }; connection. onclose = function() {. . . }; connection. onerror = function(err) {. . . }; connection. onmessage = function(evt) {. . . }; • Aktionen Nachricht an Server senden ledonbutton. onclick = function() { connection. send(’ON’); } ledoffbutton. onclick = function() { connection. send(’OFF’); } TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 24

Web. Sockets 3 • Code für ESP 8266 mit Web. Sockets. Server-Bibliothek #include <Web.

Web. Sockets 3 • Code für ESP 8266 mit Web. Sockets. Server-Bibliothek #include <Web. Sockets. Server. h> Web. Sockets. Server websocks(81); • Web. Sockets. Server starten, Eventhandler installieren websocks. begin(); websocks. on. Event(websocks_event); • Eventhandler bei Nachrichten vom Client (Browser) void websocks_event(uint 8_t num, WStype_t typ, uint 8_t *pay, size_t len) { switch(typ) case WStype_DISCONNECTED: // handle disconnect case WStype_CONNECTED: // handle connect case WStype_TEXT: // handle message } } TCP/IP-Programmierung - Peter Klingebiel - HS Fulda - FB AI 25