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

📄 protocol.cpp

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

#include "protocol.h"
#include <stdlib.h>
#include <stdio.h>

             /*/////////////////////////////
             //       protocol.cpp        //

             /////////////////////////////*/
//函数的实现

  // 奇偶校验
  int checksum_mat(int framekind,int frameseq,packet p)
  {   
      int num;
      int checkbit;

	  num=1;

      //对包中的数据信息先进行奇偶校验,
	  while (p.data[num]!='\0')
	   {   		   
		  p.data[num]=(p.data[num])^(p.data[num-1]);
		  num++;
	   }
       
	   //得出包中数据信息的校验位
	   checkbit=p.data[num-1];

	   //再把帧的类型和序号与校验位异或,最后得出这个帧的一个校验位
	   checkbit=checkbit^framekind;
	   checkbit=checkbit^frameseq;
	   printf("the checkbit is %d\n",checkbit);
                                  	  
	  return checkbit;

  }  //end of checksum_mat


 //连接函数,返回连接到服务器是否成功
 bool connect_to_server(SOCKET &sock)
 {
	 int ret;
	 WSADATA wsaData;
	 struct sockaddr_in seraddr;
	 char inputip[40];
	 char * ip; //服务器ip地址
	 unsigned short port;  //端口
	 
	 if (WSAStartup(0x101,&wsaData))
	 {  exit(0);   } 
     
	 printf("Please input SERVER IP:");
	 scanf("%s",&inputip);

	 ip=inputip;

	 printf("Please input a PORT(1024--65536):");
	 scanf("%d",&port);

	 sock=socket(AF_INET,SOCK_STREAM,0);
	
	 seraddr.sin_family=AF_INET;
	 seraddr.sin_port=htons(port);
	 seraddr.sin_addr.S_un.S_addr=inet_addr(ip);
	
	 ret=connect(sock,(struct sockaddr *)&seraddr,sizeof(seraddr));
	
	 if (ret!=SOCKET_ERROR)
		 return true;	 
	 else
		 return false;
 } //end of connect_to_server

  //从网络层取一个数据帧,读入数据放到packet中
  void from_network_layer(packet *p)
  {
	  printf("please input data that being send:");
	  scanf("%s", (*p).data);  
  }//end of from_network_layer


  //从物理层取到一个帧,返回取到的数据个数
  int from_physical_layer(SOCKET sock,frame &r)
  {
	  int num;
	  num=recv(sock,(char*)&r,sizeof(r),0);
	  return num;	  
  }// end of from_physical_layer


   //发送一个数据帧,控制发送,模拟链路质量
  void send_frame(SOCKET sock,frame s,int wp,int lp)
  {   
	  frame temp_frame;
	  int randnum;
	  int num1,num2,num3;
	  int i;

	  num1=wp;
	  num2=100-lp;
	  num3=num2+num1;

	  randnum=rand() % 100;

    if( (0<=randnum)&&(randnum<num1) ) // 修改数据
	{   
			  temp_frame=s;
			  printf("Simulate send a frame occur error!\n");
			  i=0;
			  while(temp_frame.info.data[i]!='\0')
			  {
				  if ( (rand() % 3)==0 )
					  temp_frame.info.data[i]=(char)((int)(temp_frame.info.data[i])+1);
				  i++;
			  }
			  send(sock,(char*)&temp_frame,sizeof(temp_frame),0);
	}
    else if( (num1<=randnum)&&(randnum<num2) ) //正确
	{
	      send(sock,(char*)&s,sizeof(s),0); 
	}
    else if ((num2<=randnum)&&(randnum<num3))   //丢失
	{
		  printf("Simulate frame that send lost!\n");
	}

  } //end of send_frame
 
   //将数据发往物理层准备传送,将数据发送出去
  void to_physical_layer(SOCKET sock,frame &s,int wp,int lp)
  {	  	 
		  printf("发送的数据是:%s\n",s.info.data);
		  printf("发送的序号是:%d\n",s.seq);
		  
	      send_frame(sock,s,wp,lp);		  	  
  }//end of to_physical_layer

 
   //等待一个事件发生,返回事件类型
  void wait_for_event(SOCKET sock,event_type &event,int timeout)
  {
	  fd_set readfds; 
	  struct timeval tv;

	  FD_ZERO(&readfds);//清空fdset与所有文件句柄的联系。 
      FD_SET(sock,&readfds);//建立文件句柄clisock与fdR的联系。

	  tv.tv_sec=timeout;
	  tv.tv_usec=0;

      select(sock+1, &readfds, NULL, NULL,&tv); 
      if (FD_ISSET(sock, &readfds))
		  event=frame_arrival;
	  else
		  event=time_out;

  }//end of wait_for_event


  

⌨️ 快捷键说明

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