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

Benedikt Huber, Kenan Kalajdzic - ti.tuwien.ac.at fileVortragsblock zum ersten Übungsbeispiel Vortragsblock zum ersten Übungsbeispiel Benedikt Huber, Kenan Kalajdzic Institut für

Embed Size (px)

Citation preview

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!