c语言 滑窗法_C语言模拟滑动窗口协议

#include&ltstdio.h&gt

#include&ltstdlib.h&gt

#include&ltmalloc.h&gt

main()

{

struct swphdr

{

unsigned long seqnum;

unsigned long acknum;

unsigned short flags; /*flag=0表示这是一个数据帧,flag=1表示这是一个ACK帧*/

};

struct sendq_slot

{

unsigned short timeout;/*1时表示计时启动,0时表示已收到确认*/

unsigned long msg;

struct sendq_slot *next;

};

struct recvq_slot

{

unsigned short received;/*1表示顺序接收,0表示错序接受*/

unsigned long msg;

struct recvq_slot *next;

};

struct swpstate

{

unsigned long lar;

unsigned long lfs;

unsigned long sws;

struct swphdr hdr;

unsigned long rws;

struct sendq_slot *sendq;

unsigned long nfe;

struct recvq_slot *head;

}swpstate1;

unsigned long a;

int flag,b;

/*发送*/

struct sendq_slot *sendq_rear,*sendp,*p3,*p4;

struct recvq_slot *recvp,*recvq_rear,*p1,*p2;

swpstate1.head=NULL;

swpstate1.sendq=sendq_rear=(struct sendq_slot*)malloc(sizeof(struct sendq_slot));

if(!swpstate1.sendq) exit(1);

sendq_rear-&gtnext=NULL;

printf("请输入窗口大小:");

scanf("%ld",&swpstate1.sws);

swpstate1.rws=swpstate1.sws;

if (swpstate1.sws&gt0)

{

printf("请输入第一帧的序列号:");

scanf("%ld",&swpstate1.hdr.seqnum);

}

swpstate1.nfe=swpstate1.hdr.seqnum;

sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot));

if(!sendp) exit(1);

sendp-&gtmsg=swpstate1.hdr.seqnum;

sendp-&gttimeout=1;

sendp-&gtnext=NULL;

sendq_rear-&gtnext=sendp;

sendq_rear=sendp;

--swpstate1.sws;

swpstate1.lfs=swpstate1.hdr.seqnum;

swpstate1.lar=swpstate1.hdr.seqnum;

do

{

while(swpstate1.sws&gt0)

{

sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot));

if(!sendp) exit(1);

sendp-&gtmsg=swpstate1.lfs+1;

sendp-&gttimeout=1;

sendp-&gtnext=NULL;

sendq_rear-&gtnext=sendp;

sendq_rear=sendp;

--swpstate1.sws;

++swpstate1.lfs;

}

swpstate1.hdr.acknum=0;

swpstate1.hdr.flags=0;

printf("最近收到的ACK的帧序号:%ld\n",swpstate1.lar);

printf("最近发送的帧序号(发送新帧后):%ld\n",swpstate1.lfs);

/*接收*/

if(swpstate1.hdr.flags==0)

{

do

{

printf("请输入收到的数据帧号:");

scanf("%ld",&a);

if(a&gt=swpstate1.nfe&&a&lt=swpstate1.lfs)

{

if(swpstate1.head==NULL)

{

recvp=recvq_rear=(struct recvq_slot*)malloc(sizeof(struct recvq_slot));

recvp-&gtnext=NULL;

swpstate1.head=recvp;

}

else

if(swpstate1.head!=NULL)

{

recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot));

recvp-&gtnext=NULL;

recvq_rear-&gtnext=recvp;

recvq_rear=recvp;

}

}

else

{

printf("所输数据不在接收窗口内!");

break;

}

recvp-&gtmsg=a;

if(recvp-&gtmsg==swpstate1.nfe)

recvp-&gtreceived=1;

else

recvp-&gtrece

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值