rdt3.0发送方和接收方程序(C实现)

来源:互联网 发布:我为歌狂 知乎 编辑:程序博客网 时间:2024/05/17 07:27

刚好做网络原理的实验用到了这个东西.发上来大家和大家共享下^_^(貌似有的地方不是很对,如果有用的话还是注意下吧)

Sender:

#include <stdio.h>
void sendata0();
void start();
void waitack();
void retrans1();
void retrans0();
void sendata1();
void main ()
{
 int a;
 int b;
 int c;
 int d;
                 start();//开始程序
                 return;
}
void start(){ 
 int a ;
 while (a!=1&&a!=2)
    {
        printf("******************************/n");//初始页面
        printf("欢迎进入rdt 3.0 发送方演示/n");
        printf("1: 进入数据发送     2: 退出演示/n");
        printf("请你输入你要到的选择: ");
        scanf("%d",&a);
        printf("*********************************************************/n");
    }
      if (a==1)
        sendata0();// 发送序号为0的数据抱
      if (a==2)
        exit (0);//退出程序
}

//*******************************************************************
void sendata0() //发送序号为0的数据包
{
 int b;
 while (b!=1&&b!=2)
 {
    printf("现在要发送序号为0的数据包,确认吗?/n");
    printf("1: 确认  2:退出");
    scanf("%d",&b);
       printf("*********************************************************/n");
 }
    if (b==1)
    waitack();//等待接收ack信息
 if (b==2)
 start();//返回开始程序

}

void waitack(){
 int c;
 while (c!=1&&c!=2&&c!=3&&c!=4){
printf("序号为0的数据包已经发送!!计时器已经启动:-)/n");
printf("请选择事件/n");
printf("1: 接收到ack0  2:接收到ack1 3:接收到错误的ack 4:超时了!!/n");

scanf("%d",&c);
printf("*********************************************************/n");
 }
  if (c==2||c==3||c==4)
   retrans0(); //重新发送序号为0的数据包;
  if (c==1)
   sendata1();//发送序号为1的数据包;
 
}

void retrans0(){
 printf("将重新发送序号为0的数据包/n");
  waitack();//等待ack
}

void sendata1(){
 int d;
printf("现在将要发送序号为1的数据包/n");
while (d!=1&&d!=2&&d!=3&&d!=4)
{
printf("序号为1的数据包已经发出,正在等待回应/n");
printf("1:收到ack1  2:收到ack0  3:超时了!  4:收到错误信息/n");
printf("请选择事件");
scanf("%d",&d);
printf("*********************************************************/n");
}
if (d==2||d==3||d==4)
retrans1();//重传1号数据包
if (d==1)
sendata0();//回到要发送0号数据包


}
void retrans1(){
 printf("要重新发送序号为1的数据包/n");
    sendata1();//重发1号数据包
}

Receiver:

 #include <stdio.h>
void start();
void recv0();
void recall0();
void sendack1();
void recall1();
void sendack0();
void recv1();

void main(){
 int a;
 int b;
 int c;
 int d;
 int e;
 start();//开始的画面
                 return;
}
void start(){  
 int a;
 while (a!=1&&a!=2){
  printf("*******************************/n");
  printf("欢迎使用rdt 3.0 接收方演示!!!/n");
  printf("1:进入接收的演示  2:退出/n");
  printf("请输入你的选择");
  scanf("%d",&a);
  printf("**********************************/n");
  }
 if (a==1)
  recv0();//进入接收数据包0的状态
    if (a==2)
  exit (0);//退出程序

}
void recv0(){
 int b;
 while (b!=1&&b!=2&&b!=3){
 printf("发送方已经发送了序号为0的数据包/n"); 
 printf("请选择事件:/n");
 printf("1:接收到正确的数据  2:接收到错误的数据   3:超时/n");
 scanf("%d",&b);
 printf("*******************************/n");
    }
    if (b==1)
  sendack1();//对接收到的数据包进行确认
    if (b==2||b==3)
  recall0();//发送信息让发送方重传
}


void sendack1(){
 int c;
 while (c!=1&&c!=2){
 printf("已经正确接收序号为0的数据包!!/n");
 printf("请选择事件!/n");
 printf("1:发送ack0  2:退出/n");
 scanf("%d",&c);
 printf("*****************************/n");
 }
 if (c==1)
  recv1();//转为等待接收序号为1的数据包的状态
 if (c==2)
  start();//返回开始状态
}
void recall0(){
 printf("需要发送ack1让发送方重传!!/n");
 printf("ack1已经送出!!!/n");
 printf("****************************/n");
 recv0();
}

void recv1(){
     int d;
  while (d!=1&&d!=2&&d!=3) {
      printf("发送方已经发送了数据包1 !!/n");
   printf("请选择事件/n");
   printf("1:接收到正确的数据  2:接收到错误的数据   3:超时/n");
   scanf("%d",&d);
   printf("*************************/n");
  }
  if (d==1)
   sendack0();
  if (d==2||d==3)
   recall1();
}

void sendack0(){
 int e;
 while (e!=1&&e!=2){
 printf("已经接收到序号为1的数据包!!/n");
 printf("请选择事件/n");
 printf("1:发送ack1 2:退出");
 scanf("%d",&e);
 printf("*************************/n");
 }
 if (e==1)
  recv0();
 if (e==2)
  start();
}

void recall1(){
 printf("需要发送ack0来让发送方重传!!/n");
 printf("ack0已经发送!!!/n");
 printf("***********************/n");
 recv1();
}
代码出自手头上的参考资料..

原创粉丝点击