c语言实现stop-and-wait
时间: 2023-12-11 18:02:54 浏览: 40
Stop-and-Wait是一种简单的数据链路层协议,用于在不可靠的通信信道上传输数据。下面是用C语言实现Stop-and-Wait协议的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SEQ_NUM 2 // 最大序列号
#define TIMEOUT 5 // 超时时间
typedef enum {false, true} bool;
struct packet {
int seq_num; // 序列号
char data[10]; // 数据
};
struct frame {
int ack_num; // 确认序列号
bool ack; // 确认标志
struct packet p; // 数据包
};
int seq_num = 0; // 当前序列号
bool wait_ack = false; // 是否等待确认
void send_packet(struct packet p) {
struct frame f;
f.ack_num = (seq_num + MAX_SEQ_NUM) % (MAX_SEQ_NUM + 1); // 确认序列号
f.ack = false; // 确认标志
f.p = p; // 数据包
printf("发送数据包:seq_num=%d, data=%s\n", p.seq_num, p.data);
// 模拟信道传输
if (rand() % 10 != 0) { // 传输成功
// 等待确认
wait_ack = true;
// 模拟超时
int t = 0;
while (t < TIMEOUT) {
if (!wait_ack) {
printf("接收到确认,seq_num=%d\n", seq_num);
seq_num = (seq_num + 1) % (MAX_SEQ_NUM + 1);
break;
}
t++;
}
if (t == TIMEOUT) {
printf("超时,重传数据包:seq_num=%d, data=%s\n", p.seq_num, p.data);
send_packet(p); // 重传数据包
}
} else { // 传输失败
printf("传输失败,重传数据包:seq_num=%d, data=%s\n", p.seq_num, p.data);
send_packet(p); // 重传数据包
}
}
void receive_frame(struct frame f) {
if (f.ack && f.ack_num == seq_num) { // 收到确认
printf("收到确认,seq_num=%d\n", seq_num);
wait_ack = false;
seq_num = (seq_num + 1) % (MAX_SEQ_NUM + 1);
} else { // 收到数据包
printf("收到数据包:seq_num=%d, data=%s\n", f.p.seq_num, f.p.data);
struct frame ack;
ack.ack_num = f.p.seq_num; // 确认序列号
ack.ack = true; // 确认标志
send_packet(ack.p); // 发送确认
}
}
int main() {
// 初始化随机数生成器
srand(time(NULL));
// 发送数据包
struct packet p;
p.seq_num = 0;
strcpy(p.data, "hello");
send_packet(p);
p.seq_num = 1;
strcpy(p.data, "world");
send_packet(p);
return 0;
}
```
该示例代码通过模拟信道传输和超时重传机制,实现了Stop-and-Wait协议的基本功能。在发送数据包时,先构造一个帧,包含确认序列号和数据包,然后模拟信道传输,如果传输成功,则等待接收确认,如果超时则重传数据包;如果传输失败,则直接重传数据包。在接收帧时,如果收到确认,则表示前面的数据包已经成功传输,更新当前序列号,如果收到数据包,则发送确认帧。