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

📄 fig-3-12.c

📁 计算机网络第四版的实现源代码
💻 C
字号:
/* Protocol 3 (par) allows unidirectional data flow over an unreliable channel. */#define MAX_SEQ 1		/* must be 1 for protocol 3 */typedef enum  {frame_arrival, cksum_err, timeout} event_type;#include "protocol.h"void sender3(void){  seq_nr next_frame_to_send;			/* seq number of next outgoing frame */  frame s;					/* scratch variable */  packet buffer;				/* buffer for an outbound packet */  event_type event;  next_frame_to_send = 0;			/* initialize outbound sequence numbers */  from_network_layer(&buffer);			/* fetch first packet */  while (true) {        s.info = buffer;			/* construct a frame for transmission */        s.seq = next_frame_to_send;		/* insert sequence number in frame */        to_physical_layer(&s);			/* send it on its way */        start_timer(s.seq);			/* if answer takes too long, time out */        wait_for_event(&event);			/* frame_arrival, cksum_err, timeout */        if (event == frame_arrival) {                from_physical_layer(&s);	     /* get the acknowledgement */                if (s.ack == next_frame_to_send) {                        stop_timer(s.ack);	     /* turn the timer off */                        from_network_layer(&buffer); /* get the next one to send */                        inc(next_frame_to_send);     /* invert next_frame_to_send */                }        }  }}void receiver3(void){  seq_nr frame_expected;  frame r, s;  event_type event;  frame_expected = 0;  while (true) {        wait_for_event(&event);			/* possibilities: frame_arrival, cksum_err */        if (event == frame_arrival) {		/* a valid frame has arrived. */                from_physical_layer(&r);	/* go get the newly arrived frame */                if (r.seq == frame_expected) {	/* this is what we have been waiting for. */                        to_network_layer(&r.info); /* pass the data to the network layer */                        inc(frame_expected);	/* next time expect the other sequence nr */                }                s.ack = 1 - frame_expected;	/* tell which frame is being acked */                to_physical_layer(&s);		/* send acknowledgement */        }  }}

⌨️ 快捷键说明

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