📄 client.cpp
字号:
#include "protocol.h"
#pragma comment (lib,"ws2_32")
int main(int argc,char ** argv)
{
int recvnum;
int lost_percent,wrong_percent,time_out,MAX_repeatnum;//丢失率,出错率,超时时间,重传次数
seq_nr next_frame_to_send;
frame s,r;
packet buffer;
event_type event;
int send_num[MAX_SEQ+1];
SOCKET cli_sock;//定义监听接口和会话接口
bool connectser,control;
connectser=connect_to_server(cli_sock);
if(connectser)
printf("connect to server sucessfully!\n");
else
{
printf("connect to server error!\n");
return 0;
}
for(int i=0;i<(MAX_SEQ+1);i++)
send_num[i]=0;
do
{
printf("\r\n");
printf("请输入传输数据的丢失率(%%):");
scanf("%d",&lost_percent);
printf("请输入传输数据的出错率(%%):");
scanf("%d",&wrong_percent);
}while((lost_percent+wrong_percent)>=100);
printf("\r\n");
printf("传输数据的正确率为(%%):%d",100-lost_percent-wrong_percent);
printf("\r\n");
printf("请输入超时时间(秒)(数值不能为0):");
scanf("%d",&time_out);
printf("请输入重传的次数:");
scanf("%d",&MAX_repeatnum);
next_frame_to_send=0;
control=true;
//从网络层得到要发送的数据
from_network_layer(&buffer);
//构造一个要传输的数据帧
s.kind=data;
s.seq=next_frame_to_send;
s.info=buffer;
s.checksum=checksum_mat(s.kind,s.seq,s.info);
do
{
printf("-------------------\n");
to_physical_layer(cli_sock,s,wrong_percent,lost_percent);
send_num[next_frame_to_send]++;
wait_for_event(cli_sock,event,time_out);
if (event==frame_arrival) //有数据到达
{
recvnum=from_physical_layer(cli_sock,r);
if(recvnum==-1) //检查对方是否工作正常
{
control=false;
printf("The receiver has closed!\n");
break;
}
if(r.kind==ack) //收到确认帧
{
printf("A ACK arrival!\n");
printf("The number of the ACK is:%d\n",r.ack);
from_network_layer(&buffer);
inc(next_frame_to_send);
send_num[next_frame_to_send]=0;
//构造一个要传输的数据帧
s.kind=data;
s.seq=next_frame_to_send;
s.info=buffer;
s.checksum=checksum_mat(s.kind,s.seq,s.info);
}
else //收到否认帧
{
printf("a NAK arrival!\n");
send_num[next_frame_to_send]=0;
//收到否认帧时,则重发该帧
s.kind=data;
s.seq=next_frame_to_send;
s.info=buffer;
s.checksum=checksum_mat(s.kind,s.seq,s.info);
}
}//end if (event==frame_arrival)
else //超时
{
if(send_num[next_frame_to_send]>MAX_repeatnum)
{
printf("the send_num is bigger than MAX_repeatnum! The data send will be stop!\n");
shutdown(cli_sock,0);
break;
}
else
{
printf("Occur timeout event,send the data again!\n");
}
}
}while(control);
shutdown(cli_sock,0);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -