⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csma.c

📁 code simulation csma/cd
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>/* Definition des operations MAX et MIN  */#ifndef  MAX#define MAX(a, b)  (((a) > (b)) ? (a) : (b))#endif#ifndef  MIN#define MIN(a, b)  (((a) < (b)) ? (a) : (b))#endif/* Delai moyen (repartition uniforme) entre deux requetes  d'emission d'un message aperiodique  */double  delai_moyen_entre_deux_messages_aperiodiques;/* Tirage al閍toire entre 1 et max */int tirage_aleatoire(double max){        int j=(int) (max*rand()/(RAND_MAX+1.0));	if(j<1)		j=1;	return j;}/* Informations stockees pour chaque station :  */typedef struct station {	/* Date intialement prevue pour l'emission du message		en cours de transmission  */	int date_initiale_emission_message;	/* Date d'emission comprenant le temps d'attente		aleatoire si le message 		en cours de transmission est entre en collision		avec un autre message */	int date_emission_message;	/* Memorise, pour le message en cours de 		transmission, le nombre de collision qu'il		a subi */	int nb_collision;	/* Numero de message en cours de transmission		(ex : correspond au numero d'activation		pour les messages periodiques)  */		int numero_de_message;		} station;/* Le bus est constitue de 3 stations */struct station bus[3];/* Simulation du temps */int horloge=0;/* Genere la date du message suivant a emettre */void message_suivant(int i);int main(int argc, char* argv[]){	FILE* csma;	int i=0;	int emetteur;	/* Controle des parametres : le programme prend 		en entree le delai moyen entre deux messages		emis par la station 2. */	if(argc!=2)		{		printf("utilisation : csma delai_moyen_entre_deux_messages_aperiodiques\n");		exit(0);		}		else	delai_moyen_entre_deux_messages_aperiodiques=atof(argv[1]);	/* Ce fichier stocke le temps d'acces de chaque	   message envoye par la station 0 */	csma=fopen("csma.dta","w");	if(csma==NULL)		{		printf("Pb ouverture fichier csma.dta\n");		exit(0);		}	/* On initialise la date d'emission du premier		message de chaque station */	for(i=0;i<3;i++)		{		bus[i].date_initiale_emission_message=0;		bus[i].date_emission_message=0;		bus[i].numero_de_message=0;		bus[i].nb_collision=0;		}	/* On boucle sur les 10000 premieres milli secondes */	while(horloge<10000)		{		emetteur=-1;		/* Application du protocole CSMA/CD */			ACOMPLETER /*	Vous devez ici simuler le protocole CSMA/CD, cad  :		- tester pour chaque top d'horloge			s'il y a collision (deux 			stations que souhaitent emettre			un message avec un 			date_emission_message identique)		- si collision il y a, generer, pour chaque			message,  le temps 			d'attente aleatoire conformement a 			ce qui est decrit dans le sujet et			mettre a jour la variable			date_emission_message correspond.			Vous disposez pour ce faire			des fonctions C pow() (cf. man)			et tirage_aleatoire (cf. ci-dessus).		- dans le cas ou il n'y a pas de collision,		 	la variable "emetteur" doit indiquer			l'entre dans le tableau "bus" de la 				station elue*/		/* Si emetteur est different de -1, alors, on			a emis un message : il n y a pas			eut de collision donc */		if(emetteur!=-1)			{			printf("Date %d  : Emission par station %d message numero %d\n",horloge,emetteur,bus[emetteur].numero_de_message);				/* On ecrit sur disque le temps d'acces obtenu				si la station 0 a emis un message */ 			if(emetteur==0)				fprintf(csma,"%d %d\n",bus[0].numero_de_message,horloge-bus[0].date_initiale_emission_message); 			/* On passe au message suivant */			message_suivant(emetteur);			}				horloge++;			}	fclose(csma);	exit(0);}/* Les messages aperiodiques sont generes de facon   aleatoire (loi uniforme de moyenne delai_moyen_entre_deux_messages_aperiodiques ) */ int prochain_message_aperiodique(void){        int j= (int) ((2*delai_moyen_entre_deux_messages_aperiodiques)*rand()/(RAND_MAX+1.0));        if(j<1)                j=1;        return j;}/* Une fois un message emis, on prepare l'emission du message suivant */ void message_suivant(int i){	bus[i].numero_de_message++;	switch (i)		{		/* Message periodique de periode 3 */		case	0:				{			bus[i].date_initiale_emission_message=				MAX(horloge+1,bus[i].numero_de_message*3);			break;			}		/* Message periodique de periode 9 */		case	1:				{			bus[i].date_initiale_emission_message=				MAX(horloge+1,bus[i].numero_de_message*9);			break;			}		/* Message aperiodique : date d'arrivee generee			de facon aleatoire */		case	2:				{			bus[i].date_initiale_emission_message=horloge+prochain_message_aperiodique();			break;			}		}	bus[i].date_emission_message=bus[i].date_initiale_emission_message;	bus[i].nb_collision=0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -