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

📄 server.cpp

📁 网络实验网络实验网络实验网络实验网络实验
💻 CPP
字号:

#include "protocol.h"
 
int main(int argc,char ** argv)
{
	seq_nr frame_expected;//接收状态变量
	bool check,control;
	frame r,s; //接受帧和发送帧
	event_type event;
	int recvnum; 
	SOCKET sersock,consock;//定义监听接口和会话接口
	char buff[1500];
	int num;

	bool setser; //返回设置服务器是否成功

	setser=set_server(&sersock,&consock);

	if (setser) 
		printf("set server sucessfully!\n");
	else
	{
		printf("set server error!\n"); 
		return 0;
	}

	//接收端开始工作
	 frame_expected=0; //初始化接收状态变量
	 control=true;

 do  
 {
		 printf("\n-------------------\n");
		                 
	     wait_for_event(consock,event);

		 //检测到有数据到达
		 if (event==frame_arrival)
		 {  
			 printf("frame arrival!\n");

			 //接收数据
			 recvnum=from_physical_layer(consock,r);
			 
			 //检查对方是否工作正常
			 if(recvnum==-1) 
			 {   
				 control=false;
				 printf("the sender has closed!\n");
				 break;
			 }
             
	         printf("the frame that we received is :%d%d%s%d\n",r.kind,r.seq,r.info.data,r.checksum);
        			 
             //接收到序号正确的数据帧
			 if (r.seq==frame_expected)    
			 {
				 check=examine_checksum(r); //检验效验和

				 switch(check)
				 {
					 //经过检查传输有错,发送一个否认帧
				 case false:
					 printf("Data received occur error!,a NAK will be send!\n");
					 s.kind=nak;
					 s.seq=1-s.seq;
					 s.ack=frame_expected;
					 s.info.data[0]='\0';//数据域为空
					 s.checksum=0;       //效验和设为0
					 break;

					 //数据正确无误,发送一个确认帧
				 case true: 
					 num=0;
					 printf("Data received successfully,a ACK will be send!\n");
                     
					 sprintf( buff,"%d%d%s%d\n",r.kind,r.seq,r.info.data,r.checksum );
                     
					 printf("%s","0x");
                     while(buff[num]!='\0')
					 {
				        printf("%x ",buff[num]);
				        num++;
					 }
                     printf("\r\n");

					 to_network_layer(r.info);//向网络层上交接收到的数据

					 inc(frame_expected);      //更新状态变量

					 s.kind=ack;
					 s.seq=1-s.seq;
					 s.ack=frame_expected;
					 s.info.data[0]='\0';//数据域为空
					 s.checksum=0;       //效验和设为0
				     
				 }//end switch
			 } 
			 else      //收到的数据序号不是接收方所需要的
			 {
				 //发送一个确认帧
				 printf("The number of this data is not we want, but we still send a ACK!\n");
				 s.kind=ack;
				 s.seq=1-s.seq;
				 s.ack=frame_expected;
				 s.info.data[0]='\0';//数据域为空
				 s.checksum=0;       //效验和设为0
			 }  
		     to_physical_layer(consock,s);		 
		 }//endif (event==frame_arrival) 
		 
	 }while(control);
	 
	closesocket(sersock);
	closesocket(consock);
	WSACleanup();
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -