benedikt huber, kenan kalajdzic - ti.tuwien.ac.at filevortragsblock zum ersten Übungsbeispiel...
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
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
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
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
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!