Programmieren mit sockets

Ähnliche Dokumente
Programmieren mit sockets

Programmieren mit sockets

Programmierung mit sockets

Netzwerk-Programmierung. Netzwerke. Alexander Sczyrba Michael Beckstette.

Netzwerk-Programmierung. Netzwerke.

Netzwerke. Netzwerk-Programmierung. Sven Hartmeier.

Netzwerke. Netzwerk - Programmierung. Alexander Sczyrba. Madis Rumming.

Protokolle und Schichten. Grundlagen der Rechnernetze Einführung 41

Mini-Projekt: miniirc

Projekt: Web-Server. Foliensatz 9: Projekt Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2014

Konsequenz für Forwarding Tabellen

Netzwerk-Programmierung. Nonblocking I/O. Sven Hartmeier, Jan Krüger.

Internet Modell. Nothing stated. Bildquelle: Andrew S. Tanenbaum, Computer Networks, Fourth Edition, 2003 Grundlagen der Rechnernetze Einführung 50

Rechnernetze. 6. Übung

J-1 Überblick. 1 Binden von Sockets. Besprechung 6. Aufgabe (jsh) Domain, z. B. (PF_ = Protocol Family) Byteorder bei Netzwerkkommunikation

Protokollgraph. Host 1. Host 2. Protokoll 2. Protokoll 1. Protokoll 3. Protokoll 4. Grundlagen der Rechnernetze Einführung 46

Kommunikation von Prozessen: Signale und Pipes

Adressauflösung. IP Adresse Physikalische Adresse :FF:AA:36:AB: :48:A4:28:AA:18

Client-Server TCP/IP - Kodierung

Netzwerk-Programmierung in C

Projekt: Web-Proxy. Foliensatz 9: Projekt Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Parallelisierung mit Hilfe von Netzwerkdiensten 218

IPv6 kompatible Programmierung unter Unix. Vortrag von Dipl. Inf. Matthias Scheler Paderborn, Juli 2004

Mailserver Teil 1 Linux-Kurs der Unix-AG

Perl-Praxis. Subroutinen. Jörn Clausen, Jan Krüger Jens Reeder, Alex Sczyrba. AG Praktische Informatik Technische Fakultät Universität Bielefeld

Verteilte Systeme - Java Networking (Sockets) -

. Nachrichtenübertragung. Internetkommunikation Christof Fox. Wie werden Nachrichten Übertragen?

Portieren von Anwendungen auf IPv6

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

HA-API der Oracle Clusterware 10gR2

Themen. Transportschicht. Internet TCP/UDP. Stefan Szalowski Rechnernetze Transportschicht

7. Tafelübung. Socket - Erzeugung. Netzwerkkommunikation und Byteorder. Binden von Sockets. Lösung der jsh-aufgabe. Erläuterung der rshd-aufgabe

Logging, Threaded Server

Perl-Praxis. Subroutinen. Jörn Clausen

Michael Golm, Universität Erlangen-Nürnberg, IMMD 4, 1999/ / Tafelübung 7. Netzwerkkommunikation und Byteorder

Lösung Übungszettel 6

Java und Netzwerkkommunikation

An Open Interface for Network Programming under Microsoft Windows. DI. Dr. Peter René Dietmüller

X12L 21. Oktober a) HTML - ein Dateiformat, welches maschinenlesbare Verweise (links) enthält,

Übungen zu Systemprogrammierung I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2003 H-Uebung6.fm

Perl-Praxis. CGI-Skripte. Madis Rumming, Jan Krüger.

Transmission Control Protocol (TCP)

Praktikum Netzwerke. Für den Speicherort tragen Sie Ihr Netzlaufwerk und entsprechende Unterverzeichnisse ein, z.b.:

Client/Server-Systeme

Perl-Praxis. Dateien und Daten. Jörn Clausen

Zusammenfassung für CS-Prüfung 3 Seite 1. CS-Zusammenfassung für Prüfung 3 vom Im Beispiel gibt es 3 Deadlocks

Kommunikationsnetze. 2. Direkte TCP/IP-Verbindungen 2.1 Höhere Programmiersprachen

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

7.4 Kommunikation. großzügige Pufferung, sowohl Auftragsbeziehungen als auch Nachrichten- oder Byte-Ströme, sowohl lokal als auch übers Netz

Client/Server-Systeme

Netzwerk Linux-Kurs der Unix-AG

Berkeley Sockets 187

Installation und Betrieb des Virtual Serial Port Emulators (VSPE) Mai 2012

Komplexe Datenstrukturen

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Netzwerk-Programmierung. Prozesse. Alexander Sczyrba Michael Beckstette.

Komplexe Datenstrukturen

1 Communication Domain und Protokoll

Websockets. Verbindungskanal zwischen Client-Anwendung (JavaScript in Browser) und Server.

System-Programmierung 9: Sockets. CC BY-SA, Thomas Amberg, FHNW (soweit nicht anders vermerkt)

Simple Mail Transfer Protocol, Spam und IM2000

Attribute: Name (Zuweisung eines Namens durch Binding) Communication Domain Duplizieren von Filedeskriptoren. SoS I - Ü

U7-2 Netzwerkkommunikation und Byteorder

Byteorder bei Netzwerkkommunikation Netzwerkprogrammierung - Sockets Netzwerkprogrammierung - Verschiedenes

Perl-Praxis. Subroutinen.

Client/Server-Systeme

Netzwerkprogrammierung unter Linux und UNIX

open (PIPE, " /usr/lib/sendmail -t") or die "sendmail open failed"; print PIPE "From: testuser\@desy.de\n"; print PIPE "To:

Ereignisbasierte Kommunikationsmodelle

4. Thread- und Netzwerk- Programmierung

Komplexe Datenstrukturen

File Transfer Protocol

Die Transportprotokolle: Transmission Control Protocol (TCP) User Datagram Protocol (UDP) Die Socket-Schnittstelle

Client/Server-Systeme

Python zur Lösung von AvA Übung 1 VON MORITZ FEY

7. OSI-Modell als Rollenspiel

Blatt 2, Kommunikationskanäle. Betriebssysteme. Deadlocks. Kommunikationskanäle. y=12; recv(k2, y); y = y+4; send(k1, y);

Vorlesung 11. Netze. Peter B. Ladkin Sommersemester 2001

Verbindungen zu mehreren Clients. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 23: Netzwerkprogrammierung/ Kommunikation 2

7.4 Kommunikation. Nachrichten- oder Byte-Ströme,

Verteilte Systeme - Java Networking (Sockets) 2 -

Nagios Erweiterungen Der Rest. Nagios / Icinga. OpenSource Network-Monitoring im großen Stil. Manuel Landesfeind

Client/Server-Systeme

Praxis Linux-Administration

Socket-Programmierung unter Java

Kommunikation im Netzwerk

Komplexe Datenstrukturen

Die Transportprotokolle: Transmission Control Protocol (TCP) User Datagram Protocol (UDP) Die Socket-Schnittstelle

Socket-Programmierung unter Java

System Tools Teil 7/4.1 Seite 1

Anleitung zur Konfiguration der TCP/IP-Kommunikation zwischen ArcGIS Lizenzmanager 10.5 und ArcGIS Desktop 10.5 Client(s) (Mai 2017)

# Socketprogrammierung

Client/Server-Systeme

Perl-Praxis. Dateien und Daten. Jörn Clausen Daniel Hagemeier, Jan Krüger

Transkript:

Netzwerk-Programmierung Programmieren mit sockets Alexander Sczyrba Michael Beckstette {asczyrba,mbeckste}@techfak.uni-bielefeld.de 1

Übersicht Datentypen und Konversionsfunktionen minimaler Client minimaler Server 2

Berkeley sockets sockets API, erstmals in 4.2BSD (1983) sehr genereller Aufbau: TCP/IP named pipes OSI-Protokolle... C-Funktionen Adress- und Portinformationen in structs spezielle Perl-Funktionen zur Typkonversion 3

Namen und Adressen Netzwerk-Interface durch IP-Adresse identifiziert dotted quad-notation: 129.70.132.229 lesbare Namen durch Domain Name System (DNS) www.uni-bielefeld.de 129.70.4.66 keine Bijektion 129.70.4.66 pan1.hrz.uni-bielefeld.de keine mathematische Funktion www.cnn.com (64.236.24.20, 64.236.24.28,... ) 4

Adress-Konversion use Socket; Binärdarstellung für socket-funktionen $iaddr = inet_aton( 129.70.4.66 ); $iaddr = inet_aton( www.uni-bielefeld.de ); alternativ $iaddr = gethostbyname( www.uni-bielefeld.de ); andere Richtung: $dotquad = inet_ntoa($iaddr); Namen ermitteln $name = gethostbyaddr($iaddr, AF_INET); Im Listen-Kontext liefern die gethostby*-funktionen weitere Informationen: ($name, $aliases, $type, $len, $iaddr) = gethostbyname($reqname); ($name, $aliases, $type, $len, $iaddr) = gethostbyaddr($reqiaddr, AF_INET); 5

Aufgaben Wandle die folgenden Namen in Binärdarstellung um. Übersetze diese anschließend in dotted quad-notation zurück, bzw. löse sie mit Hilfe des DNS wieder zu Namen auf. Führe das Skript mehrfach aus. Was ist zu beobachten? @hosts = qw(vino vino.techfak.uni-bielefeld.de www.ebay.com www.uni-paderborn.de www.cnn.com www.bielefeld.de ); Überprüfe die Ergebnisse mit dem Programm nslook: $ nslook -l www.ebay.com $name inet aton $iaddr inet ntoa $dotquad gethostbyaddr $nname addrconv.pl: use Socket; my @hosts = qw(vino vino.techfak.uni-bielefeld.de www.ebay.com www.uni-paderborn.de www.cnn.com www.bielefeld.de ); foreach $in_name (@hosts) { # my $iaddr = gethostbyname($in_name); my $iaddr = inet_aton($in_name); my $dotqd = inet_ntoa($iaddr); my $out_name = gethostbyaddr($iaddr, AF_INET); print "$in_name -> $iaddr -> $out_name ($dotqd)\n"; } 6

weitere Funktionen Protokolle (vgl. /etc/protocols) $proto = getprotobyname( tcp ); $tcp = getprotobynumber(6); Services (vgl. /etc/services) $service = getservbyname( daytime, tcp ); $daytime = getservbyport(13, tcp ); Auch diese Funktionen liefern im Listen-Kontext weitere Informationen zurück. 7

socket-adressen socket: Kombination aus Adresse und Port $sockaddr = sockaddr_in($port, $iaddr); andere Richtung ($port, $iaddr) = sockaddr_in($sockaddr); andere Adressfamilien $fifo = sockaddr_un( /tmp/socket ); 8

Arbeitsweise Client socket() connect() I/O close() Server 9

Client-Code erzeugen eines sockets: socket(socket, PF_INET, SOCK_STREAM, getprotobyname( tcp )) die "can t open socket: $!"; Verbindung herstellen: $sockaddr = sockaddr_in($peer_port, $peer_iaddr)); connect(socket, $sockaddr) die "can t connect: $!"; SOCKET zum lesen/schreiben verwenden socket schließen: close(socket); 10

Aufgaben Schreibe ein Client-Programm, das eine Verbindung aufbaut, alle Daten liest und die Verbindung wieder beendet. Der Zielrechner und der Zielport sollen als Argumente übergeben werden können. Probiere folgende Ports auf dem lokalen Rechner aus: 13 (daytime) 19 (chargen) 37 (time) 7 (echo) Überprüfe zunächst die zu erwartende Ausgabe mit telnet: teak:/homes/joern> telnet teak 13 Trying 129.70.128.82... Connected to teak.techfak.uni-bielefeld.de. Escape character is ˆ]. Mon Jun 2 15:26:22 2003 Connection closed by foreign host. simpleclient.pl: use Socket; if (@ARGV!= 2) { die "usage: $0 <host> <port>\n"; } my $host = shift; my $port = shift; socket(socket, PF_INET, SOCK_STREAM, getprotobyname( tcp )) die "can t open socket: $!"; my $sockaddr = sockaddr_in($port, inet_aton($host)); connect(socket, $sockaddr) die "can t connect: $!"; while ($line = <SOCKET>) { print $line; }; close(socket); 11

socket-informationen Port wird dynamisch zugewiesen (ephemeral port) beliebiges Interface bei multihomed host Informationen über sockets ermitteln: $mysockaddr = getsockname(socket); $hissockaddr = getpeername(socket); Weiterverarbeitung mit sockaddr in() 12

Aufgaben Erweitere das Programm aus der letzten Aufgabe so, daß alle Daten zur Verbindung angezeigt werden. Zur Erinnerung: socket pair: (IP-Adresse L, Port L, IP-Adresse R, Port R ) Rufe das Programm mehrfach auf. Was ist zu beobachten? infoclient.pl:... my $my_sockaddr = getsockname(socket); my ($my_port, $my_iaddr) = sockaddr_in($my_sockaddr); #my $my_addr = inet_ntoa($my_iaddr); my $my_addr = gethostbyaddr($my_iaddr, AF_INET); my $his_sockaddr = getpeername(socket); my ($his_port, $his_iaddr) = sockaddr_in($his_sockaddr); #my $his_addr = inet_ntoa($his_iaddr); my $his_addr = gethostbyaddr($his_iaddr, AF_INET); print "$my_addr.$my_port <--> $his_addr.$his_port\n";... 13

Arbeitsweise Server socket() connect() I/O close() I/O close() socket() bind() listen() accept() close() 14

Server-Code, Teil 1 socket(...) wie im Client socket an Port/Adresse binden: $sockaddr = sockaddr_in($local_port, INADDR_ANY); bind(socket, $sockaddr) die "can t bind socket: $!"; passive open und backlog: listen(socket, SOMAXCONN) die "can t listen: $!"; tatsächliche Größe des backlog abhängig vom Betriebssystem 15

Server-Code, Teil 2 Verbindungen entgegennehmen: $client_sockaddr = accept(connect, SOCKET) accept() blockiert, bis Verbindung hergestellt $client_sockaddr enthält Informationen über peer typischerweise in Schleife: while ($client_sockaddr = accept(... )) {... } CONNECT zum lesen/schreiben verwenden am Ende Verbindungs-socket schließen: close(connect); 16

Server-Code, cont. typischer Server-Code: socket(socket,...) bind(socket,...) listen(socket,...) while ( $sockaddr = accept(connect, SOCKET)) { } print CONNECT... oder line = <CONNECT> close(connect) close(socket) # optional 17

Aufgaben Schreibe einen Server, der auf Verbindungen wartet, zwei Zeilen Text sendet und dann die Verbindung schließt. Die erste Zeile soll den Client begrüßen, die zweite soll die aktuelle Uhrzeit ausgeben: hello teak.techfak.uni-bielefeld.de, nice to meet you it s Mon Jun 2 15:14:17 2003 Du kannst den Server entweder mit dem Client aus der letzten Aufgabe oder mit dem Programm telnet testen. helloserv.pl: socket(socket, PF_INET, SOCK_STREAM, getprotobyname( tcp )) die "can t open socket: $!"; bind(socket, sockaddr_in($server_port, INADDR_ANY)) die "can t bind socket: $!"; listen(socket, SOMAXCONN) die "can t listen: $!"; while (my $client_sockaddr = accept(connect, SOCKET)) { my ($client_port, $client_iaddr) = sockaddr_in($client_sockaddr); my $client_name = gethostbyaddr($client_iaddr, AF_INET); my ($peer_port, $peer_iaddr) = sockaddr_in(getpeername(connect)); my $peer_name = gethostbyaddr($peer_iaddr, AF_INET); } print CONNECT "hello $client_name, nice to meet you\n"; print CONNECT "hello $peer_name, nice to meet you\n"; print CONNECT "it s ",scalar(localtime()),"\n"; close(connect); getpeername(connect) liefert die gleichen Informationen wie $client_sockaddr. 18