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