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

📄 ping.cpp

📁 嵌入式linux ip扫描程序源代码 for ARM9 CPU 需要QT运行库
💻 CPP
字号:
#include "Ping.h"#include <stdio.h>Ping::Ping(){  Ping(56);}Ping::Ping(int dataLength){  this->dataLength=dataLength;  pid=getpid();  sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);  int size=60*1024;  setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size));  //struct timeval tv;  //tv.tv_sec=5;  //tv.tv_usec=0;  //setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));  destSockaddr.sin_family=AF_INET;  fromSockaddr.sin_family=AF_INET;  selectTimeout.tv_sec=0;  selectTimeout.tv_usec=1;  setTimeout(1,0);}//----------------------------------------------------------------------------------------------------void Ping::setDataLength(int length){  dataLength=length;}//-----------------------------------------------------------------------------------------------------int Ping::setHost(char* host){  this->host=host;  return inet_aton(host,(in_addr*)&(destSockaddr.sin_addr));}//------------------------------------------------------------------------------------------------------void Ping::setTimeout(int sec,int usec){  timeout.tv_sec=sec;  timeout.tv_usec=usec;}//--------------------------------------------------------------------------------------------------------int Ping::waitReady(){   struct timeval tt=selectTimeout;  fd_set rset;  FD_ZERO(&rset);  FD_SET(sockfd,&rset);  return(select (sockfd+1,&rset,NULL,NULL,&tt));}//------------------------------------------------------------------------------------------------------int Ping::getReply(){  int n;  socklen_t fromlen=sizeof(fromSockaddr);  int countor=3;  struct timeval tval;  while (--countor>0){    n=waitReady();        if (n==-1)      return Ping::REPLY_ERROR;  //error ,set time out    //if (n==0 )    //return Ping::REPLY_WAITING;    if (n>0){      if ((n=recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&fromSockaddr,&fromlen))<0){		if (errno==EINTR){	  //printf("eintr!\n");	  continue;	}	return Ping::REPLY_ERROR;  //error ,set time out      }      gettimeofday(&tval,NULL);      if (proc(recvbuf,n,&tval)){	//---------------------------------------------------------------             echo_ip =(&fromSockaddr)->sin_addr;           //   echo_	//----------------------------------------------------------------	return Ping::REPLY_OK;          }    }    gettimeofday(&tval,NULL);    tv_sub(&tval,&requestTime);    tv_sub(&tval,&timeout);    //printf("sec=%d,usec=%d\n",tval.tv_sec,tval.tv_usec);    if (tval.tv_sec<0 | tval.tv_usec<0)      return REPLY_WAITING;  }  return Ping::REPLY_TIMEOUT;}//----------------------------------------------------------------------------------------------/*void Ping::tv_add(struct timeval *out,struct timeval *in){  if ((out->tv_usec+=in->tv_usec)>1000000){    ++out->tv_sec;    out->tv_usec-=1000000;  }  out->tv_sec+=in->tv_sec;}*/void Ping::tv_sub(struct timeval *out,struct timeval *in){  if ((out->tv_usec-=in->tv_usec)<0){    --out->tv_sec;    out->tv_usec+=1000000;  }  out->tv_sec-=in->tv_sec;}//-------------------------------------------------------------------------------------------------------int Ping::getReplyTime(){  return (int)rtt;}//--------------------------------------------------------------------------------------------------------int Ping::proc(char* ptr,ssize_t len,struct timeval *tvrecv){  int hlen1,icmplen;  struct icmp* icmp;  struct timeval *tvsend;  struct ip *ip;  ip=(struct ip*)ptr;  hlen1=ip->ip_hl<<2;  icmp=(struct icmp*)(ptr+hlen1);  if ((icmplen=len-hlen1)<8){    //printf("icmplen (%d)<8",icmplen);    return 0;  }  if (icmp->icmp_type==ICMP_ECHOREPLY){    if (icmp->icmp_id!=(unsigned short)getpid()){      //printf(".");      return 0;    }    if (icmplen<16){      //printf("icmplen (%d)<16",icmplen);      return 0;    }    //tvsend=(struct timeval*) (icmp->icmp_data);   //--------------------------------------------------------------------------------   // printf("the icmp seq is %d",icmp->icmp_seq);    counter1=icmp->icmp_seq;    //-----------------------------------------------------------------------------------    return 1;    tvsend=&requestTime;    //printf("send second=%d.%d,recv second=%d.%d,diff=%d\n",tvsend->tv_sec,tvsend->tv_usec,tvrecv->tv_sec,tvrecv->tv_usec,tvrecv->tv_usec-tvsend->tv_usec);    tv_sub(tvrecv,tvsend);    rtt=tvrecv->tv_sec*1000.0+tvrecv->tv_usec/1000.0;        //printf("%d bytes from %s:seq=%u,ttf=%d,rtt=%.3f ms\n",icmplen,inet_ntoa(fromSockaddr.sin_addr),icmp->icmp_seq,ip->ip_ttl,rtt);  }  //else{    //printf("get icmp but not echo,type=%d\n",icmp->icmp_type);    return 0;//}}//----------------------------------------------------------------------------------------------------------------void Ping::request(){    struct icmp* icmp;  icmp=(struct icmp*)sendbuf;  icmp->icmp_type=ICMP_ECHO;  icmp->icmp_code=0;  icmp->icmp_id=pid;  icmp->icmp_seq=counter;  gettimeofday((struct timeval*)(icmp->icmp_data),NULL);  //requestTime=*((struct timeval*)(icmp->icmp_data));  gettimeofday(&requestTime,NULL);  int len=8+dataLength;  icmp->icmp_cksum=0;  icmp->icmp_cksum=in_cksum((u_short*)icmp,len);  sendto(sockfd,sendbuf,len,0,(sockaddr*)&destSockaddr,sizeof(destSockaddr));  return;}//-----------------------------------------------------------------------------------------------------------unsigned short Ping::in_cksum(unsigned short* addr,int len){  int nleft=len;  int sum=0;  unsigned short *w=addr;  unsigned short answer=0;  while (nleft>1){    sum+=*w++;    nleft-=2;  }  if (nleft==1){    *(unsigned char*)(&answer)=*(unsigned char*)w;    sum+=answer;  }  sum=(sum>>16)+(sum&0xffff);  sum+=(sum>>16);  answer=~sum;  return (answer);}//------------------------------------------------------------------------------------------------------------------char * Ping::getIp()   {       //return echo_ip;      //char *echolp;        echolp=inet_ntoa(echo_ip);        return echolp;   }	//-----------------------------------------------------------------------------------------------------------int Ping::geticmp_seq(){    return  counter1;}//int  Ping::getcounter()  // { //    return(counter-1); // }	/*int main(int argc,char * * argv){  Ping* ping=new Ping(56);  ping->setHost(argv[1]);  int result;    for (int i=0;i<10000;i++){    sleep(1);    ping->request();    for (;;){      result=ping->getReply();      //printf("result=%d\n",result);      if (result==Ping::REPLY_OK){	  printf("ping ok ! result=%d\n",result);	  int t=ping->getReplyTime();	  printf("The reply time is %d\n",t);	  break;}      if (result==Ping::REPLY_ERROR | result==Ping::REPLY_TIMEOUT){	printf("request out of time\n");	break;      }    }  }    return 0;}*/

⌨️ 快捷键说明

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