benedikt huber, kenan kalajdzic - ti.tuwien.ac.at filevortragsblock zum ersten Übungsbeispiel...

69
Vortragsblock zum ersten Übungsbeispiel Vortragsblock zum ersten Übungsbeispiel Benedikt Huber, Kenan Kalajdzic Institut für Technische Informatik Technische Universität Wien - 182.709 Betriebssysteme UE 2013S 18. März 2013

Upload: duongnhi

Post on 25-Aug-2019

223 views

Category:

Documents


0 download

TRANSCRIPT

Vortragsblockzum ersten

Übungsbeispiel

Vortragsblock zum ersten Übungsbeispiel

Benedikt Huber, Kenan Kalajdzic

Institut für Technische InformatikTechnische Universität Wien

-182.709 Betriebssysteme UE

2013S

18. März 2013

Vortragsblockzum ersten

ÜbungsbeispielÜberblick

I Richtlinien zur Entwicklung eines ÜbungsbeispielsI ProgrammerstellungI ArgumentbehandlungI Fehlerbehandlung

I Stream I/O

I Sockets

I Erstes Übungsbeispiel

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung Teil I

Konventionen zum Entwickeln derÜbungsbeispiele

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Konventionen für Übungsbeispiele

I Konventionen zur Programmerstellung erlauben allgemeingehaltene Antworten auf folgende Fragen:

I Wie erstellt man ein Programm aus den Quelldateien?I Wie verwendet man das Programm?I Wie reagiert das Programm auf einen Fehler (z.B. Datei

nicht vorhanden) ?

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Konventionen (Beispiele)

I Wie erstellt man ein Programm aus den Quelldateien?

$ make all...gcc -o mycat mycat.o

I Wie verwendet man das Programm?

$ ./mycatUsage: mycat FILE...Concatenate FILE(s) to standard output.

I Wie reagiert das Programm auf einen Fehler?

$ ./mycat XY.txt 2>mycat.errors || \echo "mycat failed"

mycat failed$ cat mycat.errorsmycat: XY.txt: No such file or directory

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Entwicklung der Übungsbeispiele

I Konventionen ArgumentbehandlungI Verwenden von getopt(3)I Hilfetext zum korrekten Programmaufruf (usage)

I Konventionen FehlerbehandlungI Konsequentes Überprüfen von RückgabewertenI Übliche Fehlerbehandlung

I Ausgabe einer FehlermeldungI Beenden des Programms mit Exitcode 6= 0

I Konventionen ProgrammerstellungI Verwendung von MakefilesI Übersetzten mit -Wall

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Shell Kommandos

Shell-Kommandos bestehen aus

I Programmnamen, oder Pfad zur ausführbaren Datei

I Optionen (options): steuern wie das Kommandoangewendet wird.

I Argumenten (positional arguments): Objekte, auf die dasKommando angewendet werden soll (Dateien,Verzeichnisse, etc.)

Beispiele:

ls -l -a /usr/local/bin /usr/binwget --verbose www.tuwien.ac.at

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

POSIX Konventionen zur Argumentbehandlung 1

I Optionen vor restlichen ProgrammargumentenI Option Kurzform: - gefolgt von einem Zeichen

I Beispiel: -cI Zusammenfassen mehrerer Optionen: -la

I Option Langform: Zeichenkette folgend --I Beispiel: --help

I Reihenfolge der Optionen üblicherweise belanglos

I Optionen dürfen in der Regel maximal einmal auftreten

1http://pubs.opengroup.org/onlinepubs/9699919799/

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Optionsargumente

I Argumente zu OptionenI Bsp . Kurzform: hello -a optarg1 -c arg1 arg2I Bsp . Langform: hello --user=max arg1 arg2I Unterscheidung zwischen Optionsargumenten und

(gewöhnlichen) Argumenten?

I Ende der Optionsliste1. Zeichenkette ist kein Argument einer Option (d.h. folgt

nicht einer Option, die ein Argument verlangt)2. entweder (a) Zeichenkette -- oder (b) Zeichenkette

beginnt nicht mit - oder --

I Weitere BeispieleI gcc -o a a.oI rm -- -

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Usage Meldung

I Dokumentiert korrekten AufrufI Beispiel: Usage: cat [-n] file...I Syntax findet auch in man pages Verwendung

I Optionale Angaben durch [] gekennzeichnet

hallo -a optarg [-o] arg1

I Alternative Optionen durch [x|y] gekennzeichnet

hallo [-a optarg | -o] arg1

I Bedingt zulässige Optionen

hallo [-a optarg [-o]] arg1

I Ein oder mehrere Vorkommen eines Arguments

hallo -a optarg file...

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Argumentübergabe an main

I Funktionsprototyp

int main (int argc, char **argv);

argc Anzahl der Elemente von argvargv Array von Kommandozeilenparametern

(argv[0]. . .argv[argc-1])

I argv[0] ist üblicherweise Programmname oder Pfad zumausgeführten Programm (aber nicht notwendigerweise)

\0 - a \0 a r l l o h a ...

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Argumentübergabe an main

Welchen Wert hat argc?

I ⇒ Anzahl Kommandozeilenparameter + 1

I hallo test2

I hallo -a argZuOpt -o test5

I hallo -a argZuOpt "-o test"4

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

getopt

I Zur Optionsbehandlung wird die Funktion getoptverwendet (Langform: getopt_long)

I Parameter für getoptI argc, argv, Spezifikation der gültigen Optionen

I Aufgaben des ProgrammierersI Vorkommens einer Option zählenI Behandlung von ungültigen OptionenI Speichern von OptionsargumentenI Überprüfung der korrekten Argumentanzahl

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

getopt Beispiel

int c;while( (c = getopt(argc, argv,"a:o")) != -1 ){switch( c ){case ’a’: /* Option mit Argument */break;

case ’o’: /* Option ohne Argument */break;

case ’?’: /* ungueltiges Argument */break;

default: /* unmoeglich */assert( 0 );

}}

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

getopt: Zählen von Optionen

int opt_o = 0;...case ’o’:opt_o++;break;

...if( opt_o > 1 ) /* max. 1 Mal */

usage();if( opt_o != 1 ) /* oder: genau 1 Mal */

usage();

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

getopt: Argumente

while( (c = getopt(argc, argv, "a:o")) != -1 ) {switch( c ) {...

}}/* (argc-optind): Anzahl Argumente */if( (argc-optind) != 2) {

usage();}/* optind: Index des ersten Arguments in argv */char *input = argv[optind];char *output = argv[optind+1]

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

getopt: Argumente zu Optionen

char *input_file = NULL;while( (c = getopt(argc, argv, "a:o")) != -1 ) {switch( c ) {case ’a’:/* optarg: Zeiger auf Optionsargument */input_file = optarg;break;

...}

}

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Informationsquelle man pages

I Für weitere Information siehe getopt(3)I Bedeutung: “Die Informationen finden sie in den man

pages zu getopt in Abschnitt 3”I Lesen der manpage unter Linux: man 3 getopt

I Verschiedene man-Pages mit dem gleichenThemen-Namen:

I getopt(1): der Shell-BefehlI getopt(3): die C Funktion

I Wichtige man page KapitelI Kommandozeilenprogramme in Abschnitt 1I C Funktionen in Abschnitt 2 (Systemaufrufe), 3

(Bibliotheksaufrufe) und 7 (Verschiedenes)

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Umgang mit Fehlern

I Fehlermeldungen auf stderrI Rückgabewert von Funktion immer abfragen

I Ausnahme: Bei Ausgabe auf stderrI Dokumentiertes Ignorieren des Rückgabewertes:

(void) fprintf(stderr,"Hallo\n");

I Beim Auftreten eines FehlersI Recovery-StrategieI In dieser LVA: ordnungsgemäßes Terminieren (alle

Ressourcen schließen, ...)

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Umgang mit Fehlern (contd.)

I Aussagekräftige FehlermeldungenI Probleme in welchem Programm? (argv[0])I Welche Probleme? (z.B. “fopen failed”)I Ursache? (strerror(errno))

I Terminieren des ProgrammsI Freigeben von Ressourcen (z.B. temporäre Dateien)I Korrekter Exitcode (EXIT_SUCCESS, EXIT_FAILURE)

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Usage-Meldungen

char *command= "<not set>";

int main (int argc, char *argv[]) {if (argc > 0) command = argv[0];...

}

void usage(void) {(void) fprintf(stderr,"Usage: %s [-a file] file\n",

command);exit(EXIT_FAILURE);

}

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Signale

I Signal = asynchrone ProzessbenachrichtigungI Beispiele

I Speicherschutzverletzung (SIGSEGV)I Interrupt vom Keyboard (SIGINT, <Ctrl>-C)I Abruptes Beenden eines Prozesses (SIGKILL)I Beenden eines Servers (z.B. via SIGTERM)

I Erzeugen von SignalenI kill 1521 (SIGTERM)I kill -9 1521 (SIGKILL)I Siehe signal(7)

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Signalbehandlung

I Für viele Signale kann Reaktion des Programmskonfiguriert werden

I Optionen: Ignorieren, Terminieren, eigene RoutineI Ausnahmen: SIGKILL, SIGSTOP, . . .I Unter Linux wird sigaction(2) zum Konfigurieren der

Signalbehandlung empfohlen

I Signale unterbrechen Ausführung vonBetriebssystemroutinen

I Option 1: Transparenter Neustart (BSD Semantik)I Option 2: Fehlercode EINTR (SysV Semantik)

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Signalbehandlungsroutinen

I C-Funktion, Signalnummer als Parameter

void handle_signal(int signal);

I EinschränkungenI Kommunikation mit eigentlichem Programm über speziell

definierte Variablen (volatile sig_atomic_t)I Nur bestimmte Funktionen sind zugelassenI Signal kann durch weiteres Signal unterbrochen werden

(Abhilfe: sigprocmask)

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Signalbehandlung konfigurieren

struct sigaction s;

/* Signalbehandlungsroutine */s.sa_handler = handle_signal;

/* Neustart unterbrochener Betriebssystemroutinen */s.sa_flags = SA_RESTART;

/* Blockieren von weiteren Signalen (sigsetops(3)) */memcpy(&s.sa_mask, &blocked_signals,

sizeof(s.sa_mask));

/* Signalbehandlung fuer SIGINT viasigaction(2) konfigieren */

sigaction(SIGINT, &s, NULL);

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Signalbehandlungsroutinen

I Globale Variablen im Signalhandler

volatile sig_atomic_t count;void signal_handler_count(int signal){

count++;}

I SynchronisationI Signalbehandlungsroutine soll u .U . nur einmal ausgeführt

oder an einer kritischen Stelle nicht unterbrochen werdenI → Vorübergehendes Deaktivieren von Signalen

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Programmerstellung (Überblick)

a.h b.h

x.c y.c

x.o y.o

Übersetzer

executable

Linker

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Programmerstellung

I ÜbersetzungseinheitI Genau eine C-Datei (üblicherweise .c)I C-Datei bindet projektspezifische und externe

Header–Dateien (.h) ein (siehe Abhängigkeiten)

I ÜbersetzenI Übersetzungseinheit → ObjektdateiI Übersetzen mit -cI Aktivieren aller Warnungen (-Wall)I Debuginformationen erzeugen (-g)I Standard: C99 (-std=c99 -pedantic)I Feature Test Macros: -D_XOPEN_SOURCE=500-D_BSD_SOURCE

I LinkenI Objektdateien → ausführbare DateiI Beispiel: gcc -o myprogram a.o b.o

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

MakefilesI Standardziele (müssen stets definiert werden)

I make all: Erstellen des Programms (aller Programme)I make clean: Entfernen aller vom Übersetzer erzeugten

DateienI Spezifizieren von Abhängigkeiten (dependencies)

I Steuern inkrementelle ÜbersetzungI Automatisches extrahieren mit gcc -MM

I Verwenden von VariablenI CC (C Compiler)I CFLAGS (C Compiler Optionen)I LDFLAGS (Linker Optionen)

a.o: a.c a.h b.h↹ $(CC) $(CFLAGS) -c -o a.o a.c

Variablen

ZielAbhängigkeiten

Tab

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Makefile Tipps

I Automatische VariablenI Ziel ($@), erste ($<) und alle ($ˆ) AbhängigkeitenI Kein unnötiges Duplizieren von VariablennamenI Ermöglichen automatische Regeln

I RegelnI Beispiel: %.o: %.cI Nur sinnvoll in Kombination mit automatischen VariablenI Anpassen durch Verändern von Variablen wie z.B. CFLAGSI In Kombination mit (evtl . automatisch extrahierten)

Abhängigkeiten

I Weitere Tipps:I Konfiguration auf der Kommandozeile:make all CC=gcc-4.7

I Markieren von Targets ohne Abhängigkeiten:.PHONY: clean

Vortragsblockzum ersten

Übungsbeispiel

KonventionenArgumentbehandlung

Fehlerbehandlung

Programmerstellung

Makefile Beispiel (Selbststudium)

CC=gccDEFS=-D_XOPEN_SOURCE=500 -D_BSD_SOURCECFLAGS=-Wall -g -std=c99 -pedantic $(DEFS)

OBJECTFILES=a.o b.o

all: myprogram

myprogram: $(OBJECTFILES)$(CC) $(LDFLAGS) -o $@ $^

%.o. %.c$(CC) $(CFLAGS) -c -o $@ $<

a.c: a.h b.hb.c: b.h

clean:rm -f $(OBJECTFILES) myprogram

.PHONY: clean

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Teil II

Stream I/O

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Aufbau des Dateisystems (Linux)I Hierarchische Struktur von DateienI Verschiedenste Dateitypen in einer gemeinsamen

Verzeichnisstruktur: “everything is a file”I Gewöhnliche DateienI VerzeichnisseI Character-, block special files (Geräte; z.B. Terminal,

Festplatte)I Named PipesI Sockets (z.B. TCP/IP sockets, UNIX domain sockets)I Symbolic links (Verweise)

/bin   /dev   /etc   /var  commands   devices   startup  and  

configura4on  files  

/lib   /man   /local  

/  

/usr  

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Filesystem Hierarchy Standard 2

I Primäre Hierarchie (Auswahl)I /bin: Wesentliche Befehle (für Benutzer)I /etc: KonfigurationsdateienI /dev: GerätedateienI /lib: Wesentliche BibliothekenI /home: BenutzerverzeichnisseI /media: Einhängepunkte für WechselmedienI /opt: ZusatzsoftwareI /proc: Virtuelles Dateisystem um Kernel- und

Prozessinformation abzufragenI /sbin: Wesentliche Systemkommandos

I /usr: Zweite Hierarchie für nicht rechnerspezifische,unveränderliche Dateien

I /usr/local: Dritte Hierarchie für rechnerspezifischeDateien

I /var: Hierarchie für veränderliche Datendateien

2http://www.pathname.com/fhs/

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Einhängen von Dateisystemen (mount)I Zusammenfassen mehrerer File-Systeme in einer

VerzeichnisstrukturI Eingebundenes Dateisystem ist entweder:

I lokal verfügbar (z.B. Partition einer Festplatte,Wechseldatenträger)

I verfügbar via Netzwerk (z.B. über NFS),I oder befindet sich selbst in einem File (z.B. loop device für

ISO-Images)

I Vorteil: unterschiedliche Dateisysteme gleichzeitigverwendbar

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Virtuelles Filesystem (VFS)

I Mehrere Dateisysteme gleichzeitig in VerwendungI Kompatibilität zu anderen Systemen (z.B. NTFS, FAT)I Sicherheit, Zuverlässigkeit der Daten (z.B. Ext3, ReiserFS)I Performance (z.B. XFS)

I Einführung einer zusätzlichen AbstraktionsebeneI Einheitliche SchnittstelleI transparentes Einbinden verschiedener physikalischer

Dateisysteme (Partitionen) in eine Directory-Struktur

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

File Descriptors

I Verweis auf Eintrag in Tabelle offener Dateien (filedescriptor table, Teil des aktuellen Prozesses)

I Standard I/OI STDIN_FILENO = 0 (Standardeingabe)I STDOUT_FILENO = 1 (Standardausgabe)I STDERR_FILENO = 2 (Fehlerausgabe)I Siehe auch: fileno(stdin), fileno(stdout),. . .

I Funktionen: open(2), close(2), read(2),write(2),. . .

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Stream IO in CI Standard I/O Bibliothek 3

#include <stdio.h>

I Stream I/O baut auf file descriptors aufI Stream Datentyp: FILEI Gepuffert (siehe fflush(3))I Konvention: Befehle beginnen mit “f”: fopen(3),fdopen(3), fwrite(3), fprintf(3), . . .

I Vordefinierte Streams stdin, stdout, stderr

Stream IOPuffer

IO

OS

3The functionality descends from a “portable I/O package” written byMike Lesk at Bell Labs in the early 1970s (Quelle: Wikipedia)

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

fopen(3)

I Die Datei path wird geöffnet, und mit Stream(Rückgabewert) verbunden

FILE *fopen(const char *path, const char *mode);

I Unterschiedliche Modi:I “r” : nur lesenI “w” : nur schreiben (existierenden Inhalt löschen)I “a” : nur schreiben (am Ende anhängen)I “r+”/“w+”/“a+”: lesen und schreiben 4

4am Dateianfang positioniert / Datei auf Länge 0 gekürzt / am Dateiendepositioniert

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

fdopen(3)

I Assoziiert einen Stream mit einem file descriptor

FILE *fdopen(int fd, const char *mode);

I fd: DateideskriptorI mode: I/O Modus

I Beispiel

FILE* f; int fd;int fd = socket(AF_INET, SOCK_STREAM,0);/* ... */if( (f = fdopen(fd, "r+")) != NULL) {

fprintf(f, "Meine Prozess-ID ist: %d\n",getpid());

}

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

fflush(3), fclose(3)

I fflush erzwingt das Schreiben von gepufferten Daten

int fflush(FILE *stream);

I fclose ruft fflush auf und schließt den Stream sowieden zugrundeliegenden Deskriptor.

int fclose(FILE *stream);

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Lesen/Schreiben

Funktion Beschreibungfread Lesen von n Elementen a s bytesfgets Lesen einer Zeilefgetc Lesen eines Zeichensfwrite Schreiben von n Elementen a s bytesfputs Schreiben eines C-Stringsfputc Schreiben eines Zeichensfprintf Formatiertes Schreibenfseek Positionieren des Dateipositionszeigers

Tabelle : Lese- und Schreiboperationen

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

ferror(3), feof(3)

I ferror ergibt den Fehlerstatus des Streams zurück (0 =error flag nicht gesetzt).

int ferror(FILE *stream);

I feof fragt ab, ob das End-Of-File Flag des Streamsgesetzt ist (wird beispielsweise von fgets gesetzt, wenndas Ende der Datei erreicht wird)

int feof(FILE *stream);

I clearerr löscht Fehlerstatus und EOF Flag

int clearerr(FILE *stream);

Vortragsblockzum ersten

Übungsbeispiel

Stream I/ODateisystem

Stream I/O

Stream I/O Beispiel

#define SIZE 512void error_exit(const char *msg);int main(int argc, char **argv) {char buffer[SIZE];FILE *f;char *file_name = ... ;if( (f = fopen(file_name,"r")) == NULL ) {

error_exit("fopen failed");}while (fgets(buffer,SIZE,f) != NULL) {

if( fputs(buffer,stdout) == EOF ) {error_exit("fputs failed");

}}if (ferror(f)) {

error_exit("fgets failed");}return 0;

}

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Teil III

Sockets

Vortragsblockzum ersten

Übungsbeispiel

Sockets

I Was sind Sockets?1. Kommunikationsmechanismus (nicht verwandte Prozesse,

u.U. verschiedene Maschinen)2. Kommunikationsendpunkt

I Client und Server kommunizieren durch Lesen von undSchreiben auf den Dateideskriptor, der dem Socketzugeordnet ist

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Socket API

I Üblicherweise Schnittstelle zur Transportschicht einesKommunikationsprotokolls

I Application Layer (HTTP, SMTP)I Socket APII Transport Layer (TCP, UDP)I Socket API (Raw Sockets)I Network Layer (IP, ARP)I Link Layer (Ethernet Driver)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Sockets

I Adressfamilie (Network Layer)I AF_INET (IP), AF_INET6 → man 7 ipI Unix Domain Sockets (Lokale Interprozesskommunikation)

→ man 7 unix

I Verbindungsorientierte SocketsI SOCK_STREAM, Default für IP ist TCPI Verbindung wird eindeutig durch zwei Endpunkte

identifiziert

I Verbindungslose SocketsI SOCK_DGRAM, Default für IP ist UDP

Vortragsblockzum ersten

Übungsbeispiel

Sockets

TCP/IP Protokoll: Client/Server

I Client und Server kommunizieren über das Senden undEmpfangen von Bytefolgen

I Eigenschaften: verbindungsorientiert, vollduplex,zuverlässig

I Endpunkte identifizieren die Verbindung:I Endpunkt Serverseite: Server IP + bekannte PortnummerI Endpunkt Clientseite: Client IP + freie Portnummer

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Client-Server Beispiel

socket()

bind()

listen()

accept()

recv()

send()

socket()

connect()

send()

recv()

Server Client

Blockiert bis zumVerbindungsaufbau

Erstellt Kommunikations-endpunkt

Ordnet SocketAdresse zu

Server ist bereit,Verbindungen anzunehmen

Verbindungsaufbau

Daten (Anfrage)

Daten(Antwort)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

System Call: socket

I Erstellt einen Kommunikationsendpunkt (Socket)

int socket(int family, int type, int protocol)

I family: Adressfamilie (Protokollfamilie)I e.g. AF_UNIX, AF_INET

I type: Art der SocketkommunikationI e.g. SOCK_STREAM, SOCK_DGRAMI Nicht alle Kombinationen von Protokollfamilie und Typ

werden unterstützt

I protocol: zu verwendendes KommunikationsprotokollI Protokollfamilie + Typ implizieren üblicherweise ProtokollI 0 → Default-Protokoll

I Rückgabewert: Handle des neu erstellten Sockets

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Client-Server Beispiel

socket()

bind()

listen()

accept()

recv()

send()

socket()

connect()

send()

recv()

Server Client

Blockiert bis zumVerbindungsaufbau

Erstellt Kommunikations-endpunkt

Ordnet SocketAdresse zu

Server ist bereit,Verbindungen anzunehmen

Verbindungsaufbau

Daten (Anfrage)

Daten(Antwort)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

System Call: bind

I Ordnet dem neu erstellten Socket eine bestimmte Adressezu

int bind(int socket,struct sockaddr *address,socklen_t addr_len)

I socket: identifiziert den zuvor erstellten Socket

I address: Datenstruktur mit lokaler Adresse (polymorph)

I addr_len: Größe der Addressdatenstruktur

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Socket Address Format

I Generische Datenstruktur für Socket - Adressen

struct sockaddr {unsigned short sa_family; /* protocol family */char sa_data[14]; /* address data. */

};

I Argument zu connect(), bind() und accept

I IP-–spezifische Datenstruktur:

struct sockaddr_in {/* address family (always AF_INET) */unsigned short sin_family;/* port num in network byte order */unsigned short sin_port;/* IP addr in network byte order */struct in_addr sin_addr;/* pad to sizeof(struct sockaddr) */unsigned char sin_zero[8];

}

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Client-Server Beispiel

socket()

bind()

listen()

accept()

recv()

send()

socket()

connect()

send()

recv()

Server Client

Blockiert bis zumVerbindungsaufbau

Erstellt Kommunikations-endpunkt

Ordnet SocketAdresse zu

Server ist bereit,Verbindungen anzunehmen

Verbindungsaufbau

Daten (Anfrage)

Daten(Antwort)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

System Call: listen

I Server ist bereit Verbindungen anzunehmen

int listen(int socket, int backlog)

I socket: identifiziert den zuvor erstellten Socket

I backlog: Anzahl an Verbindungsanfragen, die vomBetriebssysteme in einer Warteschlange verwaltet werden,bis der Server die Verbindungen annimmt (Richtwert: 5)

I Für verbindungsorientierte Protokolle

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Client-Server Beispiel

socket()

bind()

listen()

accept()

recv()

send()

socket()

connect()

send()

recv()

Server Client

Blockiert bis zumVerbindungsaufbau

Erstellt Kommunikations-endpunkt

Ordnet SocketAdresse zu

Server ist bereit,Verbindungen anzunehmen

Verbindungsaufbau

Daten (Anfrage)

Daten(Antwort)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

System Call: accept

I Warten auf eingehende Verbindungen (passiverVerbindungsaufbau)

int accept(int socket,struct sockaddr *address,socklen_t *addr_len)

I Blockiert bis zu einer Verbindungsanfrage eines ClientsI Rückgabewert ist ein Socket für die aufgebaute

Verbindung (ein Dateideskriptor)I address wird mit Addresse des Clients beschrieben

(Tatsächlicher Typ ist verbindungsabhängig, z.B.sockaddr_in)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

System Call: connect

I Aktiver Verbindungsaufbau (Client)

int connect(int socket,const struct sockaddr *address,socklen_t addr_len)

I address spezifiziert die Adresse des ServersI Kehrt nach dem Handshake zum Aufrufer zurückI Das Betriebssystem des Clients wählt üblicherweise

beliebigen, nicht verwendeten Port

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Client-Server Beispiel

socket()

bind()

listen()

accept()

recv()

send()

socket()

connect()

send()

recv()

Server Client

Blockiert bis zumVerbindungsaufbau

Erstellt Kommunikations-endpunkt

Ordnet SocketAdresse zu

Server ist bereit,Verbindungen anzunehmen

Verbindungsaufbau

Daten (Anfrage)

Daten(Antwort)

Vortragsblockzum ersten

Übungsbeispiel

Sockets

System Call: send and recv

I Nach dem Verbindungsaufbau können Daten versendetund empfangen werden

I Senden einer Nachricht über den spezifizierten Socket

int send(int socket, const void *msg,size_t msg_len, int flags)

I Empfangen einer Nachricht vom spezifizierten Socket

int recv(int socket, void* buf,size_t buf_len, int flags)

I Rückgabewert: Anzahl empfangener/versendeter BytesI Möglicherweise weniger Bytes übertragen als angefordertI → Schleife notwendig

Vortragsblockzum ersten

Übungsbeispiel

Sockets

Weitere Informationen im Wiki

I http://wiki.vmars.tuwien.ac.at/index.php/Make/Makefile_tutorial

I http://wiki.vmars.tuwien.ac.at/index.php/Sockets

I Erweiterungen, Verbesserungen und Korrekturenerwünscht

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

Teil IV

Erstes Übungsbeispiel

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

1. Übungsbeispiel

I 1a: Implementierung eines einfachen UNIX ToolsI Kennenlernen der Programmiersprache CI ArgumentbehandlungI Kennenlernen von Makefiles

I 1b: Server und Client für “mastermind”I Kommunikation via SocketsI Implementierung eines einfachen, binären ProtokollsI Sourcecode für Server ist zum Teil vorgegebenI Optional: Entwicklung einer Spielstrategie in C

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

Mastermind Beispiel

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

Abwicklung des Spiels

I 1 Server, 1 Clients

I Kommunikation via TCP/IP Sockets

I Ziel: Erraten der geheimen Farbfolge

I Client übermittelt vermutete Folge (2 Byte)I Server antwortet mit einem Byte

I Anzahl korrekt positionierter FarbenI Anzahl falsch positionierter FarbenI Statusflags (Ende des Spiels, Paritätsfehler)

I Einfaches binäres Protokoll

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

Ende des Spiels

I Spieler errät die Geheimfolge (Ausgabe Anzahl gespielterRunden)

I Erreichen der maximalen Anzahl von Runden (Serversignalisiert Ende des Spiels)

I Paritätsfehler (z.B. falsch berechnet)

I Andere Fehler (z.B. Verbindungsfehler)

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

Bewertung: Korrekte Clients/Server

I Protokoll korrekt implementiert

I Einhalten der maximalen Antwortzeit (1 Sekunde)

I Korrekte Berechnung der Serverantwort

I Terminieren mit dem korrekten Exitcode

I Ausgabe der korrekten Anzahl gespielter Runden

I Korrekte Argumentbehandlung

I Korrekte Signalbehandlung

I Einhaltung der Richtlinien zu den Übungsbeispielen

Vortragsblockzum ersten

Übungsbeispiel

Beispiele

Spielstrategien

I Optional: Implementierung von SpielstrategienI Gewinnstrategie: Strategie, die jedes Spiel in maximal 34

Zügen gewinnt

I Bonuspunkte für gute und ausgezeichneteImplementierungen

I Gut (+5): Gewinnstrategie, im Schnitt 20 oder wenigerRunden

I Ausgezeichnet (+10): Gewinnstrategie, im Schnitt 8 oderweniger Runden

Viel Spass!