Go Back N C语言(有ACK)
来源:互联网 发布:卫视直播软件下载 编辑:程序博客网 时间:2024/06/06 09:14
#include <stdio.h>#include <string.h>#include "protocol.h"#include "datalink.h"#define DATA_TIMER 3000#define ACK_TIMER 1500#define MAX_SEQ 7void inc(unsigned char* number){(*number)++;if(*number==MAX_SEQ+1)*number=0;}struct FRAME { unsigned char kind; /* FRAME_DATA */ unsigned char ack; unsigned char seq; unsigned char data[PKT_LEN]; unsigned int padding;};struct ACK_FRAME { unsigned char kind; /* FRAME_DATA */ unsigned char ack; unsigned int padding;};static unsigned char frame_nr = 0;//next frame to sendstatic unsigned char ack_expected = 0; static unsigned char buffer[MAX_SEQ+1][PKT_LEN];//static unsigned char nbuffered = 0;//缓冲区大小static unsigned char frame_expected = 0;static int phl_ready = 0;static void put_frame(unsigned char *frame, int len){ *(unsigned int *)(frame + len) = crc32(frame, len); send_frame(frame, len + 4); phl_ready = 0;}static void send_data_frame(void){ struct FRAME s; s.kind = FRAME_DATA; s.seq = frame_nr;s.ack = (frame_expected+MAX_SEQ)%(MAX_SEQ+1);// 另一端的ackmemcpy(s.data, buffer[frame_nr], PKT_LEN); dbg_frame("Send DATA %d %d, ID %d\n", s.seq, s.ack, *(short *)s.data); put_frame((unsigned char *)&s, 3 + PKT_LEN); start_timer(frame_nr, DATA_TIMER);stop_ack_timer();}static void send_ack_frame(void){ struct ACK_FRAME s; s.kind = FRAME_ACK; s.ack = (frame_expected+MAX_SEQ)%(MAX_SEQ+1); dbg_frame("Send ACK %d\n", s.ack); put_frame((unsigned char *)&s, 2);stop_ack_timer();}int BetweenAN(unsigned char a , unsigned char b , unsigned char c){if(((a<=b)&&(b<c))||((c<a)&&(a<=b))||((b<c)&&(c<a))){return 1;}else{return 0;}}int main(int argc, char **argv){ int event, arg; struct FRAME f; int len = 0;unsigned char i; protocol_init(argc, argv); lprintf("Designed by Jiang Yanjun, build: " __DATE__" "__TIME__"\n");lprintf("The argc is: %d , the argv is: %s\n",argc,*argv); disable_network_layer(); for (;;) { event = wait_for_event(&arg); switch (event) { case NETWORK_LAYER_READY:get_packet(buffer[frame_nr]); //取得数据 nbuffered++; send_data_frame();inc(&frame_nr);// next frame to send ++ break; case PHYSICAL_LAYER_READY: phl_ready = 1; break; case FRAME_RECEIVED: len = recv_frame((unsigned char *)&f, sizeof f); if (len < 5 || crc32((unsigned char *)&f, len) != 0) { dbg_event("**** Receiver Error, Bad CRC Checksum\n"); break; }else{if (f.kind == FRAME_ACK) dbg_frame("Recv ACK %d\n", f.ack);if (f.kind == FRAME_DATA) {dbg_frame("Recv DATA %d %d, ID %d\n", f.seq, f.ack, *(short *)f.data);if (f.seq == frame_expected) {dbg_frame("Recv DATA %d %d, ID %d\n put it to the NetWork\n", f.seq, f.ack, *(short *)f.data);put_packet(f.data, len - 7);inc(&frame_expected); // frame expected ++start_ack_timer(ACK_TIMER);}elsedbg_frame("Recv DATA %d %d, ID %d\n but it won't be put\n", f.seq, f.ack, *(short *)f.data);}while(BetweenAN(ack_expected,f.ack,frame_nr)){nbuffered--;stop_timer(ack_expected);inc(&ack_expected);}// send_ack_frame(); } /* if (f.ack == frame_nr){ stop_timer(frame_nr); nbuffered--; frame_nr = 1 - frame_nr; }*/ break; case DATA_TIMEOUT: dbg_event("---- DATA %d timeout\n", arg); frame_nr=ack_expected; //全部重发for(i=1;i<=nbuffered;i++){send_data_frame();inc(&frame_nr);} break;case ACK_TIMEOUT:dbg_event("---- ACK %d timeout\n", arg); send_ack_frame();break; }if (nbuffered < MAX_SEQ && phl_ready) enable_network_layer(); else disable_network_layer(); }}
0 0
- Go Back N C语言(有ACK)
- Go Back N C语言实现(无ACK)
- 运输层协议:(2)Go-Back-N 协议
- 编程实现可靠数据传输原理Go-Back-N
- n个数的全排列C语言递归 (回溯)back-tracking
- C语言 VS GO语言
- C语言里面的"\r"与"\n"有什么区别?
- go语言cgo -- C与Go互调
- C语言?Go语言?还是CGO语言!
- c语言判断素数和输入一个数n代表有n行数据的问题
- Go back to past
- Go语言”奇怪用法“有哪些?
- C语言 gets() '\n'
- N!C语言实现
- go语言和C语言的对比
- 在C语言中/n放先面和后面有什么不同啊
- c语言中转义字符中换行\n回车\r有什么区别
- C语言三个结束符有什么不同? EOF ‘\0’ '\n'
- STM32 串行通信 USART 程序例举
- 最小树形图 UVA 11183 Teen Girl Squad
- .net micro framework的入门例程-点灯神话-5.加入一个线程闪烁LED
- rmq的st算法模板题 nyoj 119
- nefu 625 Page Replacement
- Go Back N C语言(有ACK)
- spring webservice (二) 客户端开发
- PHP错误:Forbidden You don't have permission to access / on this server. 解决办法
- 复杂网络挖掘算法流水记录
- how to deal with the situation that the language support option disappears in linux ubuntu
- Ubuntu装wifi驱动(三步搞掂)
- 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)(更新到v1.1.1,增加block异步处理)┊
- .net micro framework的入门例程-点灯神话-6.使用定时器代替延时函数闪烁LED
- grep 用法详解