Beispiel Block 1

Werbung
3/18/2011
Argumentbehandlung
• Kommandos bestehen aus
• Optionen: steuern wie das Kommando angewendet wird
• Argumenten: Objekte, auf die das Kommando
Beispiel Block 1
angewendet werden soll (Dateien, Verzeichnisse, etc.)
Argumentbehandlung
Fehlerbehandlung
Signale
Sockets
Übungsaufgaben
• Beispiel:
ls -la
Optionen
Christian El Salloum
SS 2011
/usr/local/bin /usr/bin
Argumente
1
2
UNIX-Konvention
UNIX-Konvention
• Optionen vor restlichen Programmargumenten
• Option Kurzform: „-“ gefolgt von einem Zeichen
• Argumente zu Optionen
(cont.)
• Bsp: hallo -a optarg1 -c arg1 arg2
• Bsp: hallo --user=max arg1 arg2
• Ende der Optionsliste:
• Zeichenkette ist (a) kein Argument einer Option und (b)
• Beispiel: -c
• Zusammenfassen mehrerer Optionen möglich (-la)
• Option Langform: Zeichenkette folgend „--“
• Beispiel: --dry-run
beginnt nicht mit “-” bzw. “--”
• Zeichenkette “--”, nicht als Argument einer Option
• Optionen dürfen maximal einmal auftreten
• Bsp: hallo -c -c arg1 # Fehler
3
Argumentübergabe an main
(1/2)
h
a
l
l
o
\0
-
a
\0
a
Argumentübergabe an main
• Welchen Wert hat argc?
int main(int argc, char **argv)
• argc ... Anzahl der Argumente
• argv ... Liste der Argumente als Strings
(argv[0] ... argv[argc-1])
argv
4
• 1 + Anzahl Kommandozeilenparameter
• Beispiele:
r ...
5
Antwort
hallo test
2
hallo -a argZuOpt
3
hallo -aargZuOpt -o test
4
hallo -aargZuOpt „–o test“
3
6
1
3/18/2011
(1/2)
Argumente & Man Pages
getopt
• Optionale Angaben durch “[]” gekennzeichnet
• Zur Optionsbehandlung wird die Funktion getopt
verwendet (Langform: getopt_long)
hallo -a argZuOpt [-o] arg1
• Parameter für getopt
• Abhängigkeiten von Optionen
• argc, argv, Spezifikation der gültigen Optionen
hallo [-a argZuOpt [-o]]
• Alternative Optionen durch “[x|y]”
• Aufgaben des Programmierers
•
•
•
•
hallo [-a argZuOpt | -o]
• Optionen dürfen maximal einmal auftreten
• Manche Optionen müssen einmal auftreten
hallo -a argZuOpt
Vorkommens einer Option zählen
Behandlung von ungültigen Optionen
Speichern von Optionsargumenten
Überprüfung der korrekten Argumentzahl
7
getopt Beispiel
8
Zählen von Optionen
int c;
while( (c = getopt(argc, argv, “a:o”)) != EOF ){
switch( c ){
case ‘a’:
/* Option mit Argument */
break;
case ‘o’:
/* Option ohne Argument */
break;
case ‘?’:
/* ungültiges Argument */
break;
default:
/* unmöglich */
assert( 0 );
}
}
int bOptionO = 0;
...
case ‘o’:
bOptionO++;
break;
...
...
if( bOptionO > 1 ) /* max. 1 Mal */
Usage();
9
Verpflichtende Optionen
10
Argumente zu Optionen
char *szInputFile = (char *)0;
while( (c = getopt(argc, argv, “a:o”)) != EOF ){
switch( c ){
case ‘a’: /* optarg Zeiger auf Optionsarg. */
...
szInputFile = optarg;
break;
...
}
}
int bOptionO = 0;
...
case ‘o’:
bOptionO++;
break;
...
...
if( bOptionO != 1 )/* genau 1 Mal */
Usage();
11
12
2
3/18/2011
Usage-Meldungen
Umgang mit Fehlern
(1/2)
• Fehlervermeidung durch Programmierstil
• Fehlermeldungen auf stderr
• Return Codes von Funktion immer abfragen
char *szCommand = “<not yet set>“;
int main (int argc, char *argv[]) {
szCommand = argv[0];
...
}
• Ausnahme: Bei Ausgabe auf stderr
• Beim Auftreten eines Fehlers
• Recovery – Strategie
• In dieser LVA: ordnungsgemäßes Terminieren (alle
void Usage(void) {
(void) fprintf(stderr,“Usage: %s [-a arg] arg1”,
szCommand);
exit(EXIT_FAILURE);
}
Ressourcen schließen, ...)
13
Umgang mit Fehlern
(2/2)
14
Signalbehandlung
(1/2)
• Erzeugen von Signalen
• Aussagekräftige Fehlermeldungen
• <Ctrl>-C
• Probleme in welchem Programm? (argv[0])
• Welche Probleme? (z.B. fopen failed)
• Ursache? (strerror(errno))
SIGINT, kill myprog SIGTERM
• man 1 kill
• Signalbehandlungsroutine
void cleanup(int nSignal){
/* free ressources */
}
• Signal mit Routine verbinden
(void) signal(SIGINT, cleanup);
15
Signalbehandlung
(2/2)
• Globale Variablen im Signalhandler
16
Weitere Information: Man Pages
•
•
volatile int nQuit;
...
void signalHandlerQuit(int nSignal){
nQuit++;
}
(void) signal(SIGQUIT, signalHandlerQuit);
•
•
•
•
17
Beispielreferenz auf man-page: getopt(3)
Bedeutung: “Die Informationen finden sie in den man pages zu
getopt in Abschnitt 3“
Lesen der manpage unter Linux: "man 3 getopt"
Verschiedene man-Pages mit dem gleichen Themen-Namen:
• getopt(1) der Shell-Befehl
• getopt(3) das C-Kommando
Kommandozeilenprogramme in Abschnitt 1
C-Kommandos in Abschnitt 2 (Systemaufrufe), 3
(Bibliotheksaufrufe) und 7 (Verschiedenes)
18
3
3/18/2011
Sockets - Overview
What is a socket?
• Kernel view: an endpoint of communication
• Application view: a file descriptor that lets the application
Übungsbeispiel Block 1
Unix Sockets
read/write from/to the network
Clients and servers communicate with each other
by reading from and writing to socket descriptors
(Slides in English)
Christian El Salloum
SS 2010
19
Sockets – Overview
Sockets (Overview)
Typically Interface to Transport Layer
• Application Layer (HTTP, SMTP)
• Socket API
• Transport Layer (TCP, UDP)
• Socket API (Raw Sockets)
• Network Layer (IP, ARP)
• Link Layer (Ethernet Driver)
Address Families (Network Layer)
• AF_INET (IP), AF_INET6 man 7 ip
• Unix Domain Sockets (Local IPC) man 7 unix
Connection-oriented Sockets
• SOCK_STREAM, default for IP is TCP
• One socket per pair of endpoints
Connectionless Sockets
• SOCK_DGRAM, default for IP is UDP
Client-Server Example
Client-Server Example
Connection-Oriented Communication
Server
Socket()
The clients and the server communicate by
sending byte-streams via connections
Properties: point-to-point, full-duplex, reliable
Bind()
Client
Listen()
Client socket address
Client IP: ephemeral port
Client
Client host address
Client IP
Server socket address
Server IP: well-known port (e.g., 80, 25)
Connection socket pair
Server
(port 80)
Server host address
Server IP
Socket()
Accept()
Block until
a client connects
Recv()
Process
request
Send()
Establish Connection
Data (request)
Connect()
Send()
Data (reply)
Recv()
24
4
3/18/2011
Client-Server Example
System Call: socket
Server
Socket()
Means by which an application attached to the network
int socket(int family, int type, int protocol)
Bind()
Family: address family (protocol family)
• e.g. AF_UNIX, AF_INET
Client
Listen()
Socket()
Type: semantics of communication
• e.g. SOCK_STREAM, SOCK_DGRAM
Accept()
Block until
a client connects
• Not all combinations of family and type are valid
Protocol: Usually set to 0 but can be set to specific value.
• Family and type usually imply the protocol
Return value is a handle for new socket
Recv()
Process
request
Send()
Establish Connection
Connect()
Data (request)
Send()
Data (reply)
Recv()
26
System Call: bind
Socket Address Format
Generic socket address:
• For address arguments to connect, bind, and accept.
Binds a newly created socket to the specified
address
struct sockaddr { unsigned short sa_family; /* protocol family */ char sa_data[14]; /* address data. */ }; int bind(int socket, struct sockaddr *address, int addr_len)
Socket: newly created socket handle
Address: data structure of address of the local
system
Internet-specific socket address:
• (sockaddr_in *) has to be cast to (sockaddr *)
struct sockaddr_in { unsigned short sin_family; /* address family (always AF_INET) */ unsigned short sin_port; /* port num in network byte order */ struct in_addr sin_addr; /* IP addr in network byte order */ unsigned char sin_zero[8]; /* pad to sizeof(struct sockaddr) */ }; Client-Server Example
System Call: listen
Server
Socket()
Used by connection-oriented servers to indicate that an
application is willing to receive connections
Bind()
Client
int listen(int socket, int backlog)
Listen()
Socket()
Accept()
Block until
a client connects
Recv()
Process
request
Send()
Establish Connection
Data (request)
Socket: handle of newly created socket
Backlog: number of connection requests that can be
queued by the system while waiting for server to execute
accept call
Connect()
Send()
Data (reply)
Recv()
29
5
3/18/2011
Client-Server Example
System Call: accept
Server
Socket()
Passive open
Bind()
int accept(int socket,
struct sockaddr *address,
socklen_t *addr_len)
Client
Listen()
Socket()
Accept()
Block until
a client connects
Recv()
Process
request
Send()
Establish Connection
Data (request)
Connect()
Blocks until a remote client carries out a connection request.
Returns a new socket for the new connection
Send()
Data (reply)
Recv()
31
Client-Server Example
System Call: connect
Server
Socket()
Active open of a connection
Bind()
int connect(int socket, struct sockaddr
*address, int addr_len)
Client
Listen()
Socket()
Accept()
Block until
a client connects
Recv()
Process
request
Send()
Establish Connection
Data (request)
Call returns when the handshake is complete
Address field contains remote system’s address
Client OS usually selects random, unused local port
Hint: Use getnameinfo to get the IP address from a
hostname
Connect()
Send()
Data (reply)
Recv()
33
System Call: send and recv
After a connection has been established, data can
be sent and received
Send specified message using specified socket
int send(int socket, char *message,
int msg_len, int flags)
Übungsbeispiel Block 1
Übungsaufgaben
Receive message from specified socket into specified buffer
int recv(int socket, char *buffer,
int buf_len, int flags)
Christian El Salloum
SS 2010
36
6
3/18/2011
1. Übungsbeispiel
Abwicklung des Würfelspiels
1a: Implementierung eines einfachen UNIX Tools
1 Server, 3 Clients
Kommunikation via TCP/IP Sockets
Ziel: Erreichen von 150 Punkten
Spieler würfeln reihum
Jeder Client führt über Punktezahl aller Spieler
Buch
Einfaches Protokoll, 1 Zeile Text pro Nachricht
Kennenlernen der Programmiersprache C
Argumentbehandlung
Kennenlernen von Makefiles
1b: Würfelspielclient für „dicerace“
Kommunikation via Sockets
Signalbehandlung
Implementierung eines einfachen Protokolls
Optional: Entwicklung einer Spielstrategie in C
18.03.2011
1.Übungsbeispiel
37
Spielbeginn
18.03.2011
1.Übungsbeispiel
38
Spieler IDs
Spieler 1
Spieler 2
In THRW Nachrichten werden Spieler anhand
einer relativen ID (0,1 oder 2) identifiziert
ID 0: Direkter Nachfolger des Empfängers (E1)
ID 1: Direkter Vorgänger des Empfängers (E2)
ID 2: Empfänger
Achtung: In den abschließenden BYE Nachrichten
ist die Reihenfolge
(2) AUTH player1
(1) HELO from Server
Server
Spieler 3
BYE Sender-Punktestand E1-Punktestand E2-Punktestand
18.03.2011
1.Übungsbeispiel
39
Spielregeln
18.03.2011
1.Übungsbeispiel
40
Würfeln (1)
Spieler 1
Der Spieler, der an der Reihe ist,…
(a) fordert den Spielleiter auf zwei Würfel zu
werfen
(2a) ROLL
(2b) SAVE
(1) TURN 0 Your turn!
Gleiche Augenzahl: Verlust Punkte dieser Runde,
nächster Spieler
Ansonsten wird Punktestand um Würfelsumme erhöht
Spieler 2
Server
Spieler 3
(b) sichert den Punktestand
Punktestand wird in nächste Runde übernommen
Nächster Spieler an der Reihe
18.03.2011
1.Übungsbeispiel
41
18.03.2011
1.Übungsbeispiel
42
7
3/18/2011
Würfeln (2)
Würfeln (3)
Spieler 1
(1) TURN 0 Your turn!
Spieler 2
Spieler 1
(2a) ROLL
(3) THRW 2 4 5 gewürfelt
Server
(3) THRW 1 4 5 gewürfelt
18.03.2011
(1) TURN 9 Your turn!
Spieler 3
Spieler 2
(2a) ROLL
Server
(3) THRW 1 2 3 gewürfelt
(3) THRW 0 4 5 gewürfelt
1.Übungsbeispiel
43
Würfeln (4)
(3) THRW 2 2 3 gewürfelt
18.03.2011
Spieler 3
(3) THRW 0 2 3 gewürfelt
1.Übungsbeispiel
44
Würfeln (5)
Spieler 1
Spieler 1
Rundenpunkte
gesichert (14)
(1) TURN 14 Your turn!
Spieler 2
Rundenpunkte
verloren
(2a) SAVE
Server
(1) TURN 14 Your turn!
Spieler 3
Spieler 2
(3) THRW 1 3 3 gewürfelt
Spieler 2 hat noch keine Punkte
1.Übungsbeispiel
(3) THRW 2 3 3 gewürfelt
Server
(3) TURN 0 Your turn!
18.03.2011
(2a) ROLL
Spieler 3
(3) THRW 0 3 3 gewürfelt
(4) TURN 0 Your turn!
45
Ende des Spiels
18.03.2011
1.Übungsbeispiel
Ende des Spiels
Spieler 1 hat bereits 192 Punkte
Erreicht ein Spieler 150 Punkte endet das Spiel
Der Sieger und die Verlierer erhalten Gewonnen!
bzw. Verloren! Nachrichten
Die Spieler verabschieden sich, und geben den
Endpunktestand aller Mitspieler bekannt
Spieler 1
201 >= 200 Punkte
(3) THRW 2 4 5 gewürfelt
(1) TURN 192 Your turn!
(4a) WIN Gewonnen!
(2a) ROLL
Spieler 2
Nachdem sich auch der Server verabschiedet hat,
terminieren die Clients
Server
Spieler 3
(4b) DEF verloren
(4c) DEF verloren
(5b) BYE 0 0 201
(5c) BYE 0 201 0
(6b) BYE
1.Übungsbeispiel
(6) BYE
(5a) BYE 201 0 0
Wird zur Bewertung des Beispiels herangezogen
18.03.2011
46
47
18.03.2011
(6c) BYE
1.Übungsbeispiel
48
8
3/18/2011
Bewertung: Korrekte Clients
dicerace
Protokoll korrekt implementiert!!
Einhalten der maximalen Antwortzeit (3 Sekunden)
Eigene Punkte und Punkte der Mitspieler korrekt
protokolliert (siehe auch BYE Nachricht)
Korrekte Argumentbehandlung
Korrekte Signalbehandlung
Einhaltung der Richtlinien zu den
Übungsbeispielen
18.03.2011
1.Übungsbeispiel
Wettbewerb: Beste Würfelstrategie
Optional, für interessierte StudentInnen
Bonuspunkte für die erfolgreichsten Clients
Nur funktional korrekte Clients dürfen teilnehmen
49
18.03.2011
1.Übungsbeispiel
50
http://wiki.vmars.tuwien.ac.at/
ENDE
Danke für die
Aufmerksamkeit!
18.03.2011
1.Übungsbeispiel
51
18.03.2011
Block zum 1.Übungsbeispiel
52
9
Herunterladen