- 论坛徽章:
- 0
|
写了个ping程序,能ping自己,ping不通网关,怎么会事??
- #include<unistd.h>;
- #include<errno.h>;
- #include<sys/types.h>;
- #include<sys/socket.h>;
- #include<sys/time.h>;
- #include<signal.h>;
- #include<arpa/inet.h>;
- #include<netinet/in.h>;
- #include<netinet/in_systm.h>;
- #include<netinet/ip.h>;
- #include<netinet/ip_icmp.h>;
- #include<netdb.h>;
- int sock;
- char sendbuf[1500],recvbuf[1500];
- int datalen=56;
- int nsend=0;
- pid_t pid;
- char *host,namebuf[50];
- struct sockaddr_in to;
- struct sockaddr_in from;
- unsigned short in_cksum(unsigned short *,int);
- void err_quit(char *);
- void pinger(void);
- void ping_loop(void);
- void proc_pack(ssize_t ,struct timeval *);
- void sig_alrm(int);
- main(int argc,char **argv)
- {
- struct sigaction act;
- struct hostent *ht;
- pid=getpid();
- act.sa_handler=sig_alrm;
- act.sa_flags=0;
- sigemptyset(&act.sa_mask);
- sigaction(SIGALRM,&act,NULL);
- // signal(SIGALRM,sig_alrm);
- to.sin_family=AF_INET;
- to.sin_addr.s_addr=inet_addr(argv[1]);
- if(to.sin_addr.s_addr!=(unsigned int)-1)
- host=argv[1];
- else
- {
- if(!(ht=gethostbyname(argv[1])))
- err_quit("gethostbyname");
- to.sin_family=ht->;h_addrtype;
- memmove(&to.sin_addr,ht->;h_addr,ht->;h_length);
- strncpy(namebuf,ht->;h_name,sizeof(namebuf)-1);
- host=namebuf;
- }
- printf("PING %s (%s): %d bytes data\n",host,
- inet_ntoa(*(struct in_addr *)&to.sin_addr.s_addr),
- datalen);
- ping_loop();
- }
- void ping_loop(void)
- {
- int size;
- socklen_t len;
- ssize_t n;
- struct timeval tv;
- if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))<0)
- err_quit("socket");
- sig_alrm(SIGALRM);
- for(;;)
- {
- len=sizeof(from);
- // alarm(1);
- n=recvfrom(sock,recvbuf,1500,0,(struct sockaddr *)&from,&len);
- if(n<0)
- {
- if(errno==EINTR)
- continue;
- else
- err_quit("recvfrom");
- }
- gettimeofday(&tv,NULL);
- proc_pack(n,&tv);
- }
- }
- void sig_alrm(int signo)
- {
- //signal(SIGALRM,sig_alrm);
- pinger();
- alarm(1);
- return;
- }
- void pinger(void)
- {
- struct icmp *icp;
- int cc;
- int i;
- icp=(struct icmp *)sendbuf;
- icp->;icmp_type=ICMP_ECHO;
- icp->;icmp_code=0;
- icp->;icmp_seq=nsend++;
- icp->;icmp_id=pid;
- gettimeofday((struct timeval *)icp->;icmp_data,NULL);
- cc=datalen+8;
- icp->;icmp_cksum=in_cksum((unsigned short *)icp,cc);
- i=sendto(sock,sendbuf,cc,0,
- (struct sockaddr *)&to,sizeof(struct sockaddr));
- if(i<0||i!=cc)
- err_quit("sendto");
- }
- unsigned short 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);
- }
- void proc_pack(ssize_t len,struct timeval *tvrecv)
- {
- int hlen1,icmplen;
- double rtt;
- struct ip *ip;
- struct icmp *icmp;
- struct timeval *tvsend;
- char buf[50];
- ip=(struct ip *)recvbuf;
- hlen1=ip->;ip_hl<<2;
- icmp=(struct icmp *)(recvbuf+hlen1);
- if((icmplen=len-hlen1)<8)
- err_quit("icmplen1");
- if(icmp->;icmp_type==ICMP_ECHOREPLY)
- {
- if(icmp->;icmp_id!=pid)
- return;
- if(icmplen<16)
- err_quit("icmplen2");
- printf("%d bytes from %s:seq=%u,ttl=%d\n",
- icmplen,
- inet_ntoa(from.sin_addr),
- icmp->;icmp_seq,
- ip->;ip_ttl);
- }
- }
- void err_quit(char *msg)
- {
- perror(msg);
- exit(1);
- }
复制代码 |
|