previous next Up Title Contents Index

Tehtävä 52

Sanomanvälitysjärjestelmän simulointi
Lähettäjä Kanava Vastaanottaja
(prosessi) (siirtotie) (prosessi)
Kirjoita ohjelma, jolla voit simuloida sanomien lähettämistä ja vastaanottamista. Sanomat, joiden rakenne on esitetty alla olevissa tietorakenteissa lähetetään ohjelmassa kanavaan, josta ne otetaan myös vastaan. Kanavan sisältöä monitoroidaan channel_monitor()-funktion avulla. Kanavan simuloidaan globaalin channel-muuttujan avulla. Täydennä seuraava ohjelmarunko puuttuvilla funktioilla ja testaa se (ohjelma on kirjan mukana olevalla levykkeellä: H52.C):
union ip_addr_t{ /* Internet-osoitteen tyyppi */
unsigned long long_form;
unsigned char octet[4];
};
struct sanoma_t{ /* Sanoman tyyppi */
union ip_addr_t vastottaja;
union ip_addr_t lahettaja;
unsigned char id; /* Sanoman tunniste */
unsigned char pituus; /* Sanoman pituus */
char data[30]; /* vakiomittainen data */
};
union message_t{ /* Kanavan sisältö */
struct sanoma_t msg; /* Tulkinta 1: sanoma */
unsigned char octet[40]; /* Tulkinta 2: 40 tavua */
};
struct sanoma_t make_message(void);
/* Muodostetaan sanoma */
void show_message(struct sanoma_t *);
/* Tulostetaan sanoma kuvaruudulle */
void send(struct sanoma_t *);
/* Lähetetään sanoma kanavaan */
void receive(struct sanoma_t *);
/* Otetaan sanoma vastaan */
void channel_monitor(void);
/* Monitoroidaan kanavaa */
union message_t channel; /* Kanava */
void main(void)
{
struct sanoma_t sanoma_out;
struct sanoma_t sanoma_in;
int jatko;
clrscr();
do
{
/* Simuloidaan lähettämistä */
sanoma_out=make_message();
send(&sanoma_out);
/* Monitoroidaan kanavaa */
channel_monitor();
/* Simuloidaan vastaanottoa */
receive(&sanoma_in);
show_message(&sanoma_in);
printf ("Uusi sanoma (k/e)?"); jatko=getche();
}while (jatko=='k');
}
struct sanoma_t make_message(void)
{
/* Rakennetaan sanoma */
}
void send(struct sanoma_t *sanoma)
{
/* Sanoma kanavaan */
}
void channel_monitor(void)
{
/* Monitoroidaan kanavaa (heksatuostus) */
int i;
for (i=0; i<sizeof(struct sanoma_t); i++)
{
printf ("%02hx",channel.octet[i]);
}
}
void receive(struct sanoma_t *sanoma)
{
/* Sanoma kanavasta */
}
void show_message(struct sanoma_t *sanoma)
{
/* Tulostetaan sanoma kuvaruudulle */
}

previous next Up Title Contents Index