Aufgabe 1 --------- Schreibt ein Programm zum Empfangen und Anzeigen (als Hexdump) von UDP-Paketen. Dieser UDPspy soll über Kommandozeilenparameter gesteuert werden und mindestens die folgenden Optionen unterstützen: UDPspy -a -i -s -l -a: erhält eine Adreßspezifikation. Für jede der so angegeben Adressen soll ein Socket erzeugt werden, und die auf ihm empfangenen Datenpakete sollen ausgegeben werden. Die Adreßspezifikation erfolgt in einer der folgenden Formen: a.b.c.d/port wobei a.b.c.d eine IPv4-Adresse ist hostname/port wobei hostname ein über DNS auflösbarer Name ist a:b:c:d:e:f:g:h/port (optional) wobei a:...:h eine IPv6-Adresse darstellt. Hinweis: RFC2732 enthält Beispiele für zulässige Notationen von IPv6-Adressen im oben angegebenen Format. Achtung: Sowohl a.b.c.d als auch hostname können sowohl Unicast- als auch Multicast-Adressen liefern (zur Erinnerung: Multicast-Adressen sind aus dem Bereich 224.0.0.0 bis 239.255.255.255). Je nach Adreßtyp ist hier eine unterschiedliche Behandlung erforderlich. Achtung: Die Auflösung von hostname mittels gethostbyname() liefert potentiell mehrere IP-Adresse zurück. Falls das der Fall ist, soll für jede dieser Adressen ein Socket aufgemacht werden (zumindest für jede IPv4-Adresse). Die Unicast-Adresse und die Portnummer oder nur die Portnummer (nicht aber eine Multicast-Adresse) wollen in der Datenstruktur "struct sockaddr_in" an bind () übergeben werden. Für Multicast-Adressen muß im Anschluß an das bind () noch ein setsockopt () mit IP_ADD_MEMBERSHIP erfolgen (siehe unten). -i: IP-Adresse der Schnittstelle, über die Multicast-Pakete empfangen werden sollen. Diese sollte auf Rechnern mit mehr als einer Netzkarte immer angegeben werden. Die Schnittstelle wird zusammen mit der IP-Multicast-Adresse in der Datenstruktur "struct ip_mreq" für den System-Call setsockopt () mit der Option IP_ADD_MEMBERSHIPP angegeben werden. -s: schaltet die Kurzform der Ausgabe ein. -l: schaltet den Hexdump der Ausgabe ein. Sind -s und -l angegeben, werden beide ausgegeben. Ist keine Option angegeben, findet gar keine Ausgabe statt. -F: sorgt dafür, daß die Ausgaben pro angegebener Adresse (Option -a) in einer eigenen Datei ausgegeben werden. -F erhält einen Parameter, der als Präfix für die anzulegenden Dateien verwendet wird. Den Rest des Dateinamens müßt Ihr aus den Adreßinformationen generieren. Beispiel: udpspy -a 224.1.2.3/9000 -a 224.4.5.6/9001 -F test3 sollte Ausgaben in zwei Dateien liefern, z.B. test3-224.1.2.3-9000 test3-224.4.5.6-9001 Das Programm sollte sich mit Control-C geordnet abbrechen lassen und dann die Laufzeit, die Anzahl der empfangenen Pakete sowie die Summe der empfangenen Bytes ausgeben, etwa: Duration: 123.123456 seconds, received 57 packets, 4530 bytes total Nützliche Funktionen: --------------------- Parsieren von Kommandozeilen: getopt () Zeit: gettimeofday () Signalbehandlung: signal () Sockets: gethostbyhame () bzw. getaddrinfo () inet_aton () bzw. inet_addr () socket (), bind (), setsockopt (), close () recvfrom (), sendto (), poll () Infos zu Schnittstellen (in der Shell): ifconfig Hinweise: --------- Einzeiliges Format der Kurzform: 14:09:00.123456 134.102.218.59:40000 -> 134.102.218.58:47000 79 Bytes Ein Hexdump sollte etwa so aussehen: Offset Einzelne Bytes in hexadezimal Zeichen (*) ------ ----------------------------------------------- ---------------- 000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ (*) Zeichen mit ASCII-Codes zwischen 32 und 127 sollten ausgegeben, alle anderen durch einen "." reprasentiert werden