📄 ping.c
字号:
/** Copyright (c) 2004,wuxi xietong tech corp* All rights reserved.** filename:hc_key.c* content :key dispatch for HC** version :2.0* author :hwz* date :2004/03/01**/#include "common.h"#include "hc.h"#include <stdio.h>#include <arpa/inet.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h>#include <time.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/wait.h>#include <string.h>#include <stdarg.h>#include <netdb.h>#include <netinet/ip_icmp.h>#include <math.h>#include <netinet/in.h>void hc_key_sock_init(void);int ping_four(void);int ping_test(void);int unpackip(char *buf,int len);unsigned short cal_chksum(unsigned short *addr,int len);void ping(void);int sock_pings;struct sockaddr_un addr_rec;struct sockaddr_un addr_wtdog;//#define SEVR_ADDR "192.168.0.87"#define SEVR_ADDR "172.29.1.14"#define TIMEL 3 int main(void){ struct hc_event_msg_str msg; time_t now_time=0; time_t last_time=0; int pingret=-1; int count=0; int count_ok=0; int once=1; err_dump_init("/tmp/ping.log"); set_sighandler(); hc_global_init(); hc_key_sock_init(); DEBUG_DUMP("begin while ..."); while(1){ now_time = time(NULL); if( (now_time-last_time) >= TIMEL) { pingret = ping_four(); if(pingret == 0) { count = 0; if(once ==1) count_ok = 1; } else { count_ok = 0; count++; } last_time = now_time; err_dump(PRINT_ERROR,"***********msg.event_key = %d\n",count); } if(count == 2){ msg.type = HC_EVENT_TYPE_KEY; msg.event_key = -1; sendto(sock_pings, (char *)&msg, sizeof(msg), 0, (struct sockaddr *)&addr_rec, sizeof(addr_rec)); count = 0; once=1; } if(count_ok == 1) { msg.type = HC_EVENT_TYPE_KEY; msg.event_key=0; sendto(sock_pings, (char *)&msg, sizeof(msg), 0, (struct sockaddr *)&addr_rec, sizeof(addr_rec)); once=0; count_ok=0; } } close(sock_pings); return 0; }void hc_key_sock_init(){ int ret, on=1; struct sockaddr_un addr_un; unlink(HC_KEY_SOCK); sock_pings = socket(PF_UNIX, SOCK_DGRAM, 0); setsockopt(sock_pings, SOL_SOCKET, SO_REUSEADDR,(char *)&on, sizeof(on)); addr_un.sun_family = AF_UNIX; strcpy(addr_un.sun_path, HC_KEY_SOCK); ret = bind(sock_pings, (struct sockaddr *)&addr_un, sizeof(addr_un)); if( ret<0 ){ ERR_DUMP(); exit(-1); } addr_rec.sun_family = AF_UNIX; strcpy(addr_rec.sun_path, HC_EVENT_GENERAL_SOCK); addr_wtdog.sun_family = AF_UNIX; strcpy(addr_wtdog.sun_path, HC_EVENT_WTDOG_SOCK);}int sock_ping;int datalen =56;int seq =0;int iTimeOut = 1;char message_buf[256];struct sockaddr_in send_addr;unsigned short cal_chksum(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 ping(void){ int len; struct icmphdr *icmp; icmp = (struct icmphdr*)message_buf; icmp->type = ICMP_ECHO; icmp->code = 0; icmp->un.echo.sequence = seq++; icmp->un.echo.id = getpid(); gettimeofday((struct timeval *)(icmp+1), NULL); len=datalen+8; icmp->checksum = 0; icmp->checksum = cal_chksum((unsigned short*)icmp, len); len =sendto(sock_ping, message_buf, len, 0, (struct sockaddr*)&send_addr, sizeof(send_addr)); if (len < 0){ err_dump(PRINT_ERROR,"send_to error\n"); }}int unpackip(char *buf,int len){ int iphdrlen; struct ip *ip; struct icmp *icmp;/* struct timeval *tvs; struct timeval tvr; double rrt;*/ ip=(struct ip *)buf; iphdrlen=ip->ip_hl<<2; icmp=(struct icmp *)(buf+iphdrlen); len-=iphdrlen; if( len<8) { err_dump(PRINT_ERROR, "ICMP packets\'s length is less than 8\n"); return -1; } if( (icmp->icmp_type==ICMP_ECHOREPLY)){/* gettimeofday(&tvr,NULL); tvs=(struct timeval*)(icmp+1); hdtv(&tvr,tvs); rrt = tvr.tv_sec*1000.0+tvr.tv_usec/1000.0; err_dump(PRINT_ERROR,"**************rtt:%.3fms\n",rrt);*/ return 0; }else return -1; return 0;}int ping_test(void){ int size; int ret; if ((sock_ping = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)) < 0){ err_dump(PRINT_ERROR,"socket\n"); return -1; } bzero(&send_addr,sizeof(send_addr)); send_addr.sin_family = AF_INET; send_addr.sin_addr.s_addr = inet_addr(SEVR_ADDR); seq = 0; ping(); usleep(200); size = recvfrom(sock_ping, message_buf, sizeof(message_buf), MSG_DONTWAIT, NULL, NULL);// size = recvfrom(sock_ping, message_buf, sizeof(message_buf), 0, NULL, NULL); if( size<=0 ) { close( sock_ping );// err_dump(PRINT_ERROR," size<=0\n"); return -1; } ret = unpackip(message_buf, size); if( ret<0 ){// err_dump(PRINT_ERROR,"ret=unpackip<0 \n"); close( sock_ping ); return -1; } close( sock_ping ); return 0;}int ping_four(void){ int i; int count; int ret; for(i=0;i<10;i++){ count = 8;rep: ret = ping_test(); if (ret != 0) {// err_dump(PRINT_ERROR,"ping fail count:%d\n",count); count --; if (count > 0) goto rep; return -1; }else{// err_dump(PRINT_ERROR,"ping ok count:%d\n",count); break; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -