刚好做网络原理的实验用到了这个东西.发上来大家和大家共享下^_^(貌似有的地方不是很对,如果有用的话还是注意下吧)
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();
}
代码出自手头上的参考资料..