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

📄 protocol.cpp

📁 网络实验网络实验网络实验网络实验网络实验
💻 CPP
字号:
#include "protocol.h"

             /*/////////////////////////////
             //       protocol.cpp        //
             /////////////////////////////*/
//函数的实现

    //检查效验和,返回检查的结果
  bool examine_checksum(frame r)
  {
	  int sum=0;
	  int num=0;

	  while (r.info.data[num]!='\0')
	  {
		  if ((num/1000)==0)   //num为1000的整数倍
			  sum=sum % 100000;
		  
		  sum+=(int)(r.info.data[num]);
		  num++;
	  }

	  if (sum==r.checksum)
		  return true;
	  else
		  return false;
  }//end of examine_checksum

  //从物理层取到一个帧,返回取到的数据个数
  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

   //连接函数,返回监听和接收是否成功
 bool set_server(SOCKET * listensock,SOCKET * sessionsock)
 {
	 WSADATA wsaData;
	 int len;
	 struct sockaddr_in seraddr,cliaddr;
	 char name[255]; //主机名
     char * ip;      //主机ip
     PHOSTENT hostinfo; 
	 unsigned short port;  //端口

	 if (WSAStartup(0x101,&wsaData))
	 { 
		 printf("WSAStartup faile!\n"); 
		 exit(0);
	 }

	(*listensock)=socket(AF_INET,SOCK_STREAM,0);

	//获取本机IP地址
    if( gethostname ( name, sizeof(name)) == 0)   //返回标准的本机主机名
   { 
       if((hostinfo = gethostbyname(name)) != NULL) //根据主机名返回主机信息
      { 
        ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list); 
		printf("The host IP is:%s\n",ip);  //输出本机的Ip地址
      } 
   } 

    //输入端口号
	printf("Please input a PORT(1024--65536):");
	scanf("%d",&port);
	seraddr.sin_family=AF_INET;
	seraddr.sin_port=htons(port);
	seraddr.sin_addr.S_un.S_addr=inet_addr(ip);

	bind(*listensock,(sockaddr *)&seraddr,sizeof(seraddr));
	listen(*listensock,3);
    
	printf("Begin listening...\n");
	
	len=sizeof(cliaddr);
	(*sessionsock)=accept(*listensock,(sockaddr *)&cliaddr,&len);
	if ((*sessionsock)!=SOCKET_ERROR)
	{	
		printf("connect from %s:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
	    return true;
	}
	else
		return false;
 } //end of set_server


   //将数据发送到网络层
  void to_network_layer(packet p)
  {   
	    char buff[1500];
		int num;

	    printf("The data send to NETWORK layer is:%s\n",p.data);

	    num=0;
					                     
		sprintf( buff,"%s\n",p.data );                     
	    printf("%s","0x");
        while(buff[num]!='\0')
		{
		   printf("%x ",buff[num]);
		   num++;
		}
  }
   //end of to_network_layer

  
   //将数据发往物理层传送
  void to_physical_layer(SOCKET sock,frame &s)
  {	  	 
	   send(sock,(char*)&s,sizeof(s),0); 		  	  
  }
   //end of to_physical_layer

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

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

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

      select(sock+1, &readfds, NULL, NULL,NULL); 
      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 + -