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

📄 ping.c

📁 一个通过无线设备传输文件程序主要涉及内容是网络通信和RS232设置
💻 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 + -