⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.cpp

📁 网络实验网络实验网络实验网络实验网络实验
💻 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 + -