?? ping.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;}*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -