下面是一个简单的使用RAWSOCKET实现的ping程序,填入(n)处。 /*simple ping program*/ struct sockaddr_in saddr; int rawsock; unsigned short i

admin2009-05-15  32

问题 下面是一个简单的使用RAWSOCKET实现的ping程序,填入(n)处。
   /*simple ping program*/
   struct sockaddr_in saddr;
   int rawsock;
   unsigned short in_cksum(unsigned short*addr, int len)
   {   int sum=0;
       unsigned short res=0;
       while(1en>1){
       sum+=*addr++; len-=2;
         }
           if(len=1){
       *((unsigned char *)(&res))=*((unsigned char *)addr); sum+=res;
       }
       sum=(sum>>16)+(sam & 0xffff);
       sum+=(sum>>16); res=~sum;
       return res;
     }
   void ping(int signo)
   {
   int len;
   int i;
   static unsigned short seq=0;
   char buff[8192];
   struct timeval tv;
   struet icmp*icmph=(struct icmp * )buff;
   long*data=(long*)icmph→icmp_data;
   bzero(buff, 8192);
   gettimeofday(&tv, NULL);
   icmph→icmp_type=ICMP_ECHO;
   icmph→icmp_code=0;
   icmph→icmp_cksum=0;
   icmph→icmp_id=0;
   icmph→icmp_seq=0;
   icmph→icmp_id=getpid()&0xffff;
   icmph→icmp_seq=seq++;
   data[0]=tv.tv_sec;
   data[1]=tv.tv_usec;
   for(i=8; i< ; i++)
   icmph→icmp_data=(unsigned char)i;
   icmph→icmp_cksum=in_cksum((unsigned short *)buff, ? 72);
   len; sendto(rawsock, buff, 72, 0, &saddr, sizeof(saddr));
   alarm(1);
   }
   void sigint(int signo)
   {   printf("CATCH SIGINT !!! \n");
       close(rawsock);
       exit(0);
   }
   void dumppkt(char*buf, int len)
   {   struct ip*iph=(struct ip*)buf;
       int i=iph→ip_h1*4;
       struct icmp*icmph=(struct icmp*)&buf;
       long*data=(long*)iemph→icmp_data;
       struct timeval tv;
       gettimeofday(&tv, NULL);
       if(icmph→icmp_type! =ICMP_ECHOREPLY)
       return;
       if(icmph→icmp_id! =(getpid()&0xffff))
       return;
       printf("From %s:ttl=% d seq=% d time=%.2f ms\n",
       inet_ntoa(iph→ip_src),iph→ip_ttl?,
       icmph→icmp_seq,
       (tv.tv_see-data[0])*1000.0+(tv.tv_usec-data[0])/1000.0);
   }
   int main(int argc, char*argv[])
   {   int len;
       stuct timeval now;
       char recvbuff[8192];
       if(1){
       printf("%s aaa.bbb.ccc.ddd\n", argv[0]);
       exit(1);
       }
   rawsock=soeket(AF_INET, (2), IPPROTO_ICMP);
   if(rawsock<0) {
   perror("soeket");
   exit(1);
   }
   bzero ( &saddr, sizeof(saddr));
   saddr.sin_family=(3);
   if( inet_aton( argv[1], &saddr.sin_addr) <0) {
   printf("invalid IP address: %s\n", argv[1]);
   exit(1);
   }
   signal(SICALRM, ping);
   signal(SICINT, sigint);
   alarm(1);
   while (1){
   len=read (4), recvbuff, 8192);
   if( len<0 && errno=EINTR)
   continue;
   else it( len<0)
   perror("read");
   else if( len>0)
   dumppkt(recvbuff, len);
      }
   close (5);
   exit(0);
      }

选项

答案(1)argc !=2 //判断参数个数是否为2; (2)SOCK_RAW //指定套接字类型为SOCK_RAW; (3)AF_INET //指定通信发生的区域是网际网区域; (4)Rawsock //指定套接字; (5)rawsock //关闭套接字。

解析
转载请注明原文地址:https://jikaoti.com/ti/rqn7FFFM
0

相关试题推荐
随机试题
最新回复(0)