Quelltxt



  • Hallo Leute. Habe ein Problem. Ich soll bis Freitag diesen Quelltext verstehen und erweitern. Nur leider verstehe ich hier garnichts... Kann mir irgendjemand helfen? Hier nochmal die Aufgaben stellung: "Sie erhalten den C-Code (auszugsweise) sowie ein Binary für ein Programm, welches einen Dump ähnlich der obigen Tabelle einliest und den Lern- und Weiterleitungsalgorithmus einer MAC-Brücke nachempfindet. Ihre Aufgabe ist es, die Funktionen zum Aufräumen der FDB (fdb_clean) und zur Aktualisierung der FDB (fdb_aktualisieren) zu implementieren. Im Anschluss ist die Funktionsfähigkeit durch Einlesen eines selbst erstellten Dumps zu überprüfen."

    Es wäre nett wenn ihr mir in irgendeienr weise helfen könntet!!!

    #include "fdb.h"
    
    /**
     * Informationen zur Nutzung der Software
     ***************************/
    void
    usage (char *name)
    {
    	fprintf (stdout, "%s [-v] [-a size] -i <file> [-o <file>]\n", name);
    	fprintf (stdout, "-i <file> Dump mit den Paketinformationen\n");
    	fprintf (stdout, "-o <file> als OUTPUT sonst STDOUT\n");
    	fprintf (stdout,
    		 "-a size Größe der FDB als zweier Potenz [3...12]\n");
    	fprintf (stdout, "-v Verbose\n");
    }
    
    struct handle_struct *
    parse_option (int argc, char **argv)
    {
    
    	static struct handle_struct handle;
    	int c;
    	extern char *optarg;
    	extern int optind;
    
    	/* init */
    	memset (&handle, 0, sizeof (handle));
    	handle.in = stdin;
    	handle.out = stdout;
    
    	while ((c = getopt (argc, argv, "a:o:i:hv")) != -1)
    		switch (c)
    		{
    		case 'h':
    			usage(argv[0]);
    			exit(0);
    			break;
    		case 'v':
    			handle.verbose = 1;
    			break;
    		case 'a':
    			handle.array_size = (unsigned short) atoi (optarg);
    			break;
    		case 'i':
    			handle.in = fopen (optarg, "r");
    			if (NULL == handle.in)
    			{
    				fprintf (stderr,
    					 "could not open infile %s\n",
    					 optarg);
    				exit (1);
    			}
    			break;
    		case 'o':
    			handle.out = fopen (optarg, "w");
    			if (NULL == handle.out)
    			{
    				fprintf (stderr,
    					 "could not open outfile %s\n",
    					 optarg);
    				exit (2);
    			}
    			break;
    		}
    	if ((handle.array_size < 3) || (handle.array_size > 12))
    	{
    		(void) fprintf (stderr,
    				"Die Größe des Arrays muss angegeben werden\n");
    		exit (3);
    	}
    	handle.fdb =
    		calloc ((1 << handle.array_size), sizeof (struct fdb_struct));
    	if (NULL == handle.fdb)
    	{
    		(void) fprintf (stderr,
    				"Nicht genug Speicher für das Array\n");
    		exit (4);
    	}
    	memset (handle.fdb, 0,
    		(sizeof (struct fdb_struct) * (1 << handle.array_size)));
    	return &handle;
    }
    
    int
    main (int argc, char **argv)
    {
    	struct handle_struct *handle;
    	struct packet_struct packet;
    	unsigned short hash;
    	size_t n;
    
    	handle = parse_option (argc, argv);
    
    	do
    	{
    		n = fread (&packet, 1, sizeof (packet), handle->in);
    		if (0 == n)
    			break;
    		if ((n < sizeof (packet)) || (0x800 != packet.type))
    		{
    			fprintf (stderr,
    				 "Die Eingabedatei ist defekt oder ... %d\n",
    				 n);
    			break;
    		}
    		if (handle->verbose)
    		{
    			fprintf (handle->out, "%s\n", print_packet (&packet));
    			fprintf (handle->out, "hash: %u\n",
    				 myhash (&(packet.src[0]),
    					 handle->array_size));
    		}
    		/* aktualisiere Eintrag in der FDB */
    		hash = myhash (&(packet.src[0]), handle->array_size);
    		fdb_aktualisieren (handle, &packet, hash);
    		/* lösche alle veralteten Einträge */
    		fdb_clean (handle, packet.timestamp);
    		/* welcher Port soll als Ausgang genutzt werden? */
    		hash = myhash (&(packet.dest[0]), handle->array_size);
    		if (handle->fdb[hash].last_timestamp < 1)
    		{
    			fprintf (handle->out,
    				 "Ziel (%u) nicht in FDB --> Broadcast!\n", 
    				 (packet.dest[0]<<16)+(packet.dest[1]<<8)+(packet.dest[2]));
    		}
    		else
    		{
    			fprintf (handle->out,
    				 "Packet über Port %u zustellen\n",
    				 handle->fdb[hash].port);
    		}
    
    		/* FDB ausgeben */
    		fdb_print (handle);
    	}
    	while (!feof (handle->in));	/* end while */
    	fcloseall ();
    	return 0;
    }
    


  • Und wo genau hast du jetzt Probleme? Wenn es schon beim Grundaufbau hapert, hättest du im Unterricht besser aufpassen sollen 😃



  • taikahn schrieb:

    Es wäre nett wenn ihr mir in irgendeienr weise helfen könntet!!!

    dann musste schon was konkretes fragen. weisst du nicht, wie das mit der 'forwarding database' funktioniert, oder worum geht's?
    🙂



  • Naja ic hverst schon garnciht dne Grundaufbau. hatte vor 4 Jahren mal c und komem einfach ncith mehr rein. Unserer Prof hat uns voll ins Wasser geschmießen... Ich weiß nicht wie das alles zusmamenhängt undso.. Bräucht soweas wie ne analyse.



  • Kauf dir ein gutes Buch zu C und dann zerleg das Programm stückweise in seine Bestandteile. Wenn du zu einem bestimmten Sprachelement Fragen hast, kannst du gerne damit zurückkommen.

    Edit: Und wo du einmal in Richtung Buchladen unterwegs bist - kauf dir bitte gleich noch einen Duden.



  • CStoll schrieb:

    Kauf dir ein gutes Buch zu C ...

    kaufen muss man zum glück nix. es gibt ohne ende tutorials und lehrbücher im netz. hier, z.b. --> http://www.beej.us/guide/bgc/output/print/bgc_A4.pdf
    taikahn: aber bis freitag 🙄 kannste's wohl knicken, wenn dein C-wissen total eingerostet ist.
    🙂


Anmelden zum Antworten