【正文】
/* Macro inc is expanded inline: Increment k circularly. */define inc(k) if (k MAX_SEQ) k = k + 1。/* Allow the network layer to cause a network_layer_ready event. */void enable_network_layer(void)。/* Start an auxiliary timer and enable the ack_timeout event. */void start_ack_timer(void)。/* Start the clock running and enable the timeout event. */void start_timer(seq_nr k)。/* Go get an inbound frame from the physical layer and copy it to r. */void from_physical_layer(frame *r)。/* Fetch a packet from the network layer for transmission on the channel. */void from_network_layer(packet *p)。/* Wait for an event to happen。 /* acknowledgement number */ packet info。 /* what kind of a frame is it? */ seq_nr seq。 /* packet definition */typedef enum {data, ack, nak} frame_kind。 /* sequence or ack numbers */typedef struct {unsigned char data[MAX_PKT]。 }}四、協(xié)議中用到的H文件define MAX_PKT 4 /* determines packet size in bytes */typedef enum {false, true} boolean。 send ack */ } if (nbuffered NR_BUFS) enable_network_layer()。 /* we timed out */ case ack_timeout: send_frame(ack,0,frame_expected, out_buf)。 /* damaged frame */ case timeout: send_frame(data, oldest_frame, frame_expected, out_buf)。 case cksum_err: if (no_nak) send_frame(nak, 0, frame_expected, out_buf)。 /* advance lower edge of sender39。 /* handle piggybacked ack */ stop_timer(ack_expected % NR_BUFS)。 between(ack_expected,(+1)%(MAX_SEQ+1),next_frame_to_send)) send_frame(data, (+1) % (MAX_SEQ + 1), frame_expected, out_buf)。 /* to see if (a separate ack is needed */ } } } if((==nak) amp。 /* advance upper edge of receiver39。 /* advance lower edge of receiver39。 arrived[frame_expected % NR_BUFS] = false。in_buf[frame_expected % NR_BUFS])。 /* mark buffer as full */ in_buf[ % NR_BUFS] = 。amp。 else start_ack_timer()。amp。r)。 /* advance upper window edge */ break。 /* fetch new packet */ send_frame(data, next_frame_to_send, frame_expected, out_buf)。 /* expand the window */ from_network_layer(amp。event)。 i++) arrived[i] = false。 /* initially no packets are buffered */ for (i = 0。 /* receiver39。 /* number of next outgoing frame */ frame_expected = 0。 /* initialize */ ack_expected = 0。 /* how many output buffers currently used */ event_type event。 /* buffers for the inbound stream */ bo