• 大小: 425KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: C/C++
  • 标签: go  back  n  gobackn  c语言  

资源简介

模仿数据链路层的gobackn协议 /*该协议是搭载ack的回退n步协议*/ #include #include "protocol.h" #define max_seq 7 #define flag 126 #define ESC 100 #define wait_time 2700 //发送计时器等待的时间 #define ack_wait_time 280 static int phl_ready = 0; unsigned char buf[max_seq+1][270]; unsigned char ack[8]; //发送空的ack帧 unsigned char in_buf[600], last_buf[520];//接收时的缓冲区;去掉冗余之后的缓冲区,为防备因误码两帧合并为一帧而定义了很大一个数组 int nbuffered=0; //发送的帧数 int buf_size[max_seq+1]; //记下以发送各帧的帧长 int next_frame_to_send=0; int frame_in_phl=0; //用于成帧 int frame_expected=0; int ack_expected=0; int between(int a,int b,int c) { if( ((a<=b)&&(b<c)) || ((c<a)&&(a<=b)) || ((b<c)&&(c<a)) ) return 1; else return 0; } //判断帧尾,防止出现误判esc esc flag为数据的情况 int end_flag(int in_len) { int count=0; int i; if(in_len=0;i--)//记录flag前的esc数目 count++; return count%2; //若flag前的esc为偶数,则为帧尾 }//成帧函数--数据帧 void send_frame(char *my_buf,int len) { int n; buf[frame_in_phl][0]=(frame_expected+max_seq)%(max_seq+1); //ack buf[frame_in_phl][1]=frame_in_phl; //发送帧的帧号 for(n=0;n<len;n++) buf[frame_in_phl][n+2]=my_buf[n]; //将处理过的新帧赋值到缓冲区中 len=len+2; *(unsigned int *)(buf[frame_in_phl]+len) = crc32(buf[frame_in_phl],len); //在原始帧的基础上加检验和 buf_size[frame_in_phl]=len+4; //记录当前帧的长度,包括3个帧头,4个检验和 nbuffered=nbuffered+1; //缓冲区占用数加一 frame_in_phl=(frame_in_phl+1)%(max_seq+1); } //成帧函数--ack帧 void send_ack() //ack帧的处理 { ack[0]=(frame_expected+max_seq)%(max_seq+1); ack[1]=max_seq+10; //ack帧的序号位,使ack[1]==frame_expected恒不成立 *(unsigned int *)(ack+2) = crc32(ack,2); //在原始帧的基础上加检验和 } //主函数 int main(int argc, char **argv) { int event, arg, n , m , i , j , len = 0 ,in_len = 0; unsigned char my_buf[260]; int phl_wait=0; //在物理层中还没有被发送的帧 protocol_init(argc, argv); enable_network_layer(); for (;;) { event = wait_for_event(&arg); switch (event) { case NETWORK_LAYER_READY:

资源截图

代码片段和文件信息

/*该协议是搭载ack的回退n步协议*/
#include 
#include “protocol.h“

#define max_seq 7
#define flag 126     
#define ESC 100
#define wait_time 2700 //发送计时器等待的时间
#define ack_wait_time 280

static int phl_ready = 0;
unsigned char buf[max_seq+1][270];
unsigned char ack[8];    //发送空的ack帧

unsigned char in_buf[600] last_buf[520];//接收时的缓冲区;去掉冗余之后的缓冲区为防备因误码两帧合并为一帧而定义了很大一个数组
int nbuffered=0;              //发送的帧数
int buf_size[max_seq+1];      //记下以发送各帧的帧长
int next_frame_to_send=0; 
int frame_in_phl=0;           //用于成帧
int frame_expected=0;
int ack_expected=0;

int between(int aint bint c)
{
if( ((a<=b)&&(b return 1;
else return 0;
}
//判断帧尾防止出现误判esc esc flag为数据的情况
int end_flag(int in_len)
{
int count=0;
int i;
if(in_len<=0)
return 1;
for(i=in_len-1;in_buf[i]==ESC&&i>=0;i--)//记录flag前的esc数目
count++;
return count%2;                    //若flag前的esc为偶数,则为帧尾
}//成帧函数--数据帧
void send_frame(char *my_bufint len)
{
int n;
buf[frame_in_phl][0]=(frame_expected+max_seq)%(max_seq+1); //ack
buf[frame_in_phl][1]=frame_in_phl; //发送帧的帧号
for(n=0;n buf[frame_in_phl][n+2]=my_buf[n]; //将处理过的新帧赋值到缓冲区中
len=len+2;
*(unsigned int *)(buf[frame_in_phl]+len) = crc32(buf[frame_in_phl]len); //在原始帧的基础上加检验和
buf_size[frame_in_phl]=len+4; //记录当前帧的长度包括3个帧头,4个检验和
nbuffered=nbuffered+1; //缓冲区占用数加一
frame_in_phl=(frame_in_phl+1)%(max_seq+1);
}
//成帧函数--ack帧
void send_ack() //ack帧的处理
{
ack[0]=(frame_expected+max_seq)%(max_seq+1);
ack[1]=max_seq+10; //ack帧的序号位,使ack[1]==frame_expected恒不成立
*(unsigned int *)(ack+2) = crc32(ack2); //在原始帧的基础上加检验和
}
//主函数
int main(int argc char **argv)
{
    int event arg n  m  i  j  len = 0 in_len = 0;
unsigned char my_buf[260];
int phl_wait=0;    //在物理层中还没有被发送的帧

    protocol_init(argc argv); 
    enable_network_layer();

    for (;;) {
        event = wait_for_event(&arg);

        switch (event) {
        case NETWORK_layer_READY:
            len = get_packet(my_buf); 
phl_wait++;
send_frame(my_buflen);
stop_ack_timer();

            if (phl_ready) {
                for(j=0;j {
//帧结构为 ack seq 内容
//每帧尾部加发送一个flag

for (i = 0; i < buf_size[next_frame_to_send]; i++){
if ((buf[next_frame_to_send][i]==flag) || (buf[next_frame_to_send][i]==ESC) )
send_byte(ESC);
send_byte(buf[next_frame_to_send][i]);
}
send_byte(flag);//帧尾

start_timer(next_frame_to_sendwait_time); //发送完启动相应的定时器
next_frame_to_send=(next_frame_to_send+1)%(max_seq+1);
}
                phl_ready  = 0; //记录物理层当前状态为
phl_wait = phl_wait-j;
            }
            break;

        case PHYSICAL_layer_READY:
            if (phl_wait) { //若有未发送的帧便发送
for(j=0;j {

for (i = 0; i < buf_size[next_frame_to_send]; i++){
if ( (buf[next_fram

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3574  2007-10-24 14:11  gobackn\datalink.dsp

     文件        541  2007-10-24 12:53  gobackn\datalink.dsw

     文件      66560  2008-12-02 21:26  gobackn\datalink.ncb

     文件       1215  2008-09-27 22:58  gobackn\protocol.h

     文件        252  2008-12-02 21:00  gobackn\datalink.plg

     文件      74690  2008-09-27 22:51  gobackn\Debug\protocol.lib

     文件      45624  2008-09-27 22:51  gobackn\Release\protocol.lib

     文件      33792  2008-12-02 21:00  gobackn\Release\vc60.idb

     文件       5242  2008-12-02 21:00  gobackn\Release\datalink.obj

     文件     180508  2008-12-02 14:23  gobackn\Release\datalink.pch

     文件      69632  2008-12-02 21:00  gobackn\Release\datalink.exe

     文件      79872  2008-12-02 19:17  gobackn\性能测试记录表.doc

     文件      50688  2008-12-02 19:28  gobackn\源程序清单-样板.DOC

     文件      37888  2008-12-02 19:21  gobackn\实验报告评语.doc

     文件      41994  2008-12-02 18:38  gobackn\测试数据\datalink-A5e-5.log

     文件     123963  2008-12-02 18:16  gobackn\测试数据\datalink-A 1e-7.log

     文件      65335  2008-12-02 18:38  gobackn\测试数据\datalink-Af –ber 1e-4.log

     文件      96352  2008-12-02 18:16  gobackn\测试数据\datalink-Af –ber 5e-4.log

     文件      64971  2008-12-02 17:19  gobackn\测试数据\datalink-Af.log

     文件      69573  2008-12-02 17:55  gobackn\测试数据\datalink-Afl.log

     文件      43509  2008-12-02 17:41  gobackn\测试数据\datalink-Afle.log

     文件      67138  2008-12-02 17:33  gobackn\测试数据\datalink-Afs.log

     文件      35678  2008-12-02 16:57  gobackn\测试数据\datalink-A无参数.log

     文件      41921  2008-12-02 18:38  gobackn\测试数据\datalink-B5e-5.log

     文件     124850  2008-12-02 18:16  gobackn\测试数据\datalink-B 1e-7.log

     文件      65543  2008-12-02 18:38  gobackn\测试数据\datalink-Bf –ber 1e-4.log

     文件      95321  2008-12-02 18:16  gobackn\测试数据\datalink-Bf –ber 5e-4.log

     文件      65507  2008-12-02 17:19  gobackn\测试数据\datalink-Bf.log

     文件      70150  2008-12-02 17:55  gobackn\测试数据\datalink-Bfl.log

     文件      43448  2008-12-02 17:41  gobackn\测试数据\datalink-Bfle.log

............此处省略13个文件信息

评论

共有 条评论