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

📄 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;//定义监听接口和会话接口

	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;
	 char buff[1500];
	 int num;

 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);
		  
		  			      			                 	
					check=examine_checksum (r);
					if (!check)
						printf("The data received is occur error! And will drop!\n");
                   //接收到序号正确的数据帧
			        if ((r.seq==frame_expected)&&check)     
					{  
					   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=0; 
					 s.ack=frame_expected;
					 s.info.data[0]='\0';//数据域为空
					 s.checksum=0;       //效验和设为0
					 printf("the number of ack is :%d\n",s.ack);
					// Sleep(1000);
					 to_physical_layer(consock,s);
					}	
					else
					{
						//收到的帧不是所要的,但也要向发送端发送一个确认号
                     s.kind=ack;
					 s.seq=0; 
					 s.ack=frame_expected;
					 s.info.data[0]='\0';//数据域为空
					 s.checksum=0;       //效验和设为0
					 printf("the number of ack is :%d\n",s.ack);
					 //Sleep(1000);
					 to_physical_layer(consock,s);
					}
		   }
		 
	 }while(control);

	shutdown(sersock,0);
	shutdown(consock,0);

	closesocket(sersock);
	closesocket(consock);
	WSACleanup();
    return 0;
}

⌨️ 快捷键说明

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