停止等待协议C语言代码
时间: 2023-05-11 11:02:45 浏览: 67
以下是一个简单的停止等待协议的 C 语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_SEQ 1
#define FRAME_SIZE 20
typedef enum { data, ack, nak } frame_kind;
typedef unsigned int seq_nr;
typedef struct {
frame_kind kind;
seq_nr seq;
seq_nr ack;
char data[FRAME_SIZE];
} frame;
bool between(seq_nr a, seq_nr b, seq_nr c) {
if (((a <= b) && (b < c)) || ((c < a) && (a <= b)) || ((b < c) && (c < a))) {
return true;
} else {
return false;
}
}
void send_data(seq_nr frame_nr, seq_nr frame_expected, char buffer[]) {
frame s;
s.kind = data;
s.seq = frame_nr;
s.ack = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1);
memcpy(s.data, buffer, FRAME_SIZE);
printf("Sending frame %d\n", frame_nr);
}
int main() {
seq_nr next_frame_to_send;
seq_nr ack_expected;
seq_nr frame_expected;
frame r, s;
char buffer[FRAME_SIZE];
bool arrived[MAX_SEQ + 1];
next_frame_to_send = 0;
ack_expected = 0;
frame_expected = 0;
memset(arrived, false, sizeof(arrived));
while (true) {
// TODO: receive frame r from physical layer
if (r.kind == data) {
if ((r.seq != frame_expected) && between(frame_expected, r.seq, next_frame_to_send)) {
// TODO: send NAK
} else {
if (r.seq == frame_expected) {
// TODO: deliver data to user
frame_expected = (frame_expected + 1) % (MAX_SEQ + 1);
ack_expected = (ack_expected + 1) % (MAX_SEQ + 1);
}
while (between(ack_expected, r.ack, next_frame_to_send)) {
// TODO: mark frame as arrived
arrived[ack_expected % (MAX_SEQ + 1)] = true;
ack_expected = (ack_expected + 1) % (MAX_SEQ + 1);
}
}
}
if ((arrived[frame_expected % (MAX_SEQ + 1)]) && (frame_expected < next_frame_to_send)) {
// TODO: send ACK
arrived[frame_expected % (MAX_SEQ + 1)] = false;
frame_expected = (frame_expected + 1) % (MAX_SEQ + 1);
}
// TODO: if user wants to send data, call send_data
}
return 0;
}
```
注意:这只是一个简单的示例代码,实际使用时需要根据具体情况进行修改和优化。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)