📄 linu.c
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <ctype.h>#include <string.h>#include <sys/utsname.h>#include <netdb.h>#include <netinet/in.h>#include <errno.h>#include <time.h>#include <sys/select.h>#include <unistd.h>#include <stddef.h>#include <linux/if_ether.h>#include <dirent.h>#define jd printf("::::%s--------%d----\n",__FUNCTION__,__LINE__);#define MAXLINE 128 char buffer[2048];int base_type=0;char packet_descrip[MAXLINE];int packet_size=0;char *default_dev="eth0";int timeout_flag=0;int timeout=1;int packet_num=5;int sock;char *mtest_log="/etc/mtest.log";#define ETH_HW_ADDR_LEN 6char mtest_pt[128];int get_hw_addr(char* buf,char* str){int i;char c,val;for(i=0;i<ETH_HW_ADDR_LEN;i++){ if( !(c = tolower(*str++))) return -1; if(isdigit(c)) val = c-'0'; else if(c >= 'a' && c <= 'f') val = c-'a'+10; else return -1; *buf = val << 4; if( !(c = tolower(*str++))) return -1; if(isdigit(c)) val = c-'0'; else if(c >= 'a' && c <= 'f') val = c-'a'+10; else return -1; *buf++ |= val; /* if(*str == ':')str++;*/ }}int sleep_ms(unsigned int ms){ struct timeval tv; tv.tv_sec = ms/1000; tv.tv_usec = ms%1000; return select(0, NULL, NULL, NULL, &tv);}/*s* change data to string in hex*/char * dtoa(u_char * data,int len){ static char str[256]; int i; for(i=0;i<len;i++){ sprintf(&str[i*2],"%02x",(unsigned char)data[i]); } str[i*2]=0; return str; }/* create socket type type=0 ; SOCK_PACKET type=1 ;SOCK_RAW type=2 ; SOCK_DGRAM type=3 ; SOCK_STREAM*/int create_socket(int type){ int on=1; switch (type) {case 0: sock=socket(AF_INET,SOCK_PACKET,ETH_P_ALL); if(sock<0){ perror("socket"); return -1;} break; case 1: sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); if(sock<0){ perror("socket"); return -1;} if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))<0) { perror("setsockopt"); return -1; } break; case 2: sock=socket(AF_INET,SOCK_DGRAM,0); if(sock<0){ perror("socket"); return -1;} break; case 3: sock=socket(AF_INET,SOCK_STREAM,0); if(sock<0){ perror("socket"); return -1;} break; default: return -1; }}/* ============================================= */char * mt_inet_ntoa(u_long addr){ static char buf[20]; u_long n; n = ntohl(addr); sprintf(buf,"%u.%u.%u.%u", (n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff); return buf;}/* function in_cksum()*/u_short in_cksum(u_short *addr, int len){ int nleft = len; int on=1; int sum = 0; u_short *w = addr; u_short answer = 0; while(nleft > 1) { sum += *w; 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;}/* get host ip address*/char **m_addrs(int *addrtype){ struct hostent *hptr; struct utsname mname; if(uname(&mname)<0) return NULL; if((hptr=gethostbyname(mname.nodename))==NULL) return NULL; *addrtype=hptr->h_addrtype; return (hptr->h_addr_list);}int is_hex(char *s){ if(*s=='0'&&*(s+1)=='x'&&isxdigit(*(s+2))!=0) return 1; else return 0;}/* delete space from a string's left and right*/char *trim(char *s){ int i=0,len; len=strlen(s); while(1) { if (s[len-1]!=' ') break ; len--; } s[len]='\0'; for(;;) { if(s[i]!=' ') return (s); s++; } }int is_end_ch(char ch){ return ch==EOF || ch=='\0' || ch=='\n' || ch=='\r' || ch=='#';}int is_sep_ch(char ch){ return ch==':' || ch==';';}char *token(char *line, char *tok){ char *p = tok; while(!is_end_ch(*line) && is_sep_ch(*line)) line++; *p = '\0'; while(!is_end_ch(*line) && !is_sep_ch(*line)) *p++ = *line++; *p = '\0'; return *tok=='\0' || is_end_ch(*line) ? NULL : line;}int put_buf(char *type_file){ FILE *fp; char *p; char buf[256]; int byte_num=0; char *ptr=buffer; char str[64]; char tok[64]; u_long value; int line=0; fp=fopen(type_file,"r"); if(fp==NULL) { fprintf(stderr,"can not open configuration file '%s',\n",type_file); return -1; } while((p=fgets(buf,sizeof(buf),fp))!=NULL) { line++; if (line==1) { token(p,tok); base_type=atoi(tok); printf("%d\n",base_type); /* }else { token(p,tok); strcpy(packet_descrip,tok); }*/ continue; } if((p=token(p,tok))==NULL) continue; p=token(p,tok); p=token(p,tok); byte_num=atoi(tok); if (byte_num==0||byte_num==-1) { fprintf(stderr,"byte num is zero or invalid\n"); exit(-1); } p=token(p,tok); strcpy(str,trim(tok)); if(is_hex(str)==1) { if(strlen(str)==14) /*if is a mac address */ { if(get_hw_addr(ptr,str+2)==-1) { fprintf(stderr,"invalid mac address\n"); exit(-1); } else { ptr+=6; jd; } }else /*if is a hex value*/ { if((value=strtoul(str,(char**)NULL,16))==-1) { fprintf(stderr,"invalid hex value\n"); exit(-1); }else { if(byte_num!=1) value=htons(value); memcpy(ptr,&value,byte_num); ptr+=byte_num; } } }else { if(strchr(str,'.')==NULL) /*if is a decimal value*/ { if((value=strtoul(str,(char**)NULL,10))==-1) { fprintf(stderr,"invalid decimal value\n"); exit(-1); }else { if(byte_num!=1) value=htons(value); memcpy(ptr,&value,byte_num); ptr+=byte_num; } }else /*if is a ip address */ { if((value=inet_addr(str))==-1) { fprintf(stderr,"invalid ip address\n"); exit(-1); }else { jd; memcpy(ptr,&value,byte_num); ptr+=byte_num; jd; } } }jd; }jd; fclose(fp); packet_size=ptr-buffer; jd;} int send_packet(char *p){ struct sockaddr sa; int i;jd; create_socket(base_type);jd; strcpy(sa.sa_data,default_dev); if(base_type>=1) sa.sa_family=AF_INET; for(i=0;i<packet_num;i++) {jd; if(sendto(sock,buffer,packet_size,0,&sa,sizeof(sa)) < 0) { perror("sendto"); /* exit(-1);*/ } if (timeout_flag==1) sleep_ms(timeout); else sleep(timeout); } exit(0); }/*char * get_packet_type(void){ char str[5]; printf("please enter packet type num:"); getline(str); return packet_type[atoi(str)-1];}*/ void usage(void){ printf("Usage: send_packet [OPTION] \n"); printf("send any custom packet program by user-defined ways\n"); printf( "\n" "-c set a packet type from show_type command (must)\n" "-i set a network interface to use(default is eth0)\n" "-n set send packets number(default is 5)\n" "-t set send packet timeout (default is 1s)\n" " number after add m : millisecond\n" " number after add s or none char : second\n");}char *get_path(void){ char str[128]; char *p; getcwd(str,128); p=strchr(str,'\0'); *p='/'; *(p+1)='\0'; strcpy(mtest_pt,str);}int main(int argc,char *argv[]){ int c; int opterr=0; char *p_char=NULL; usage(); get_path(); printf("%s\n",mtest_pt); while((c=getopt(argc,argv,"t:n:c:i:"))!=-1) { switch(c) { case 't': p_char=strchr(optarg,'\0'); if(*(p_char-1)=='m') timeout_flag=1; else timeout_flag=0; *(p_char-1)='\0'; timeout=atoi(optarg); break; case 'i' : default_dev=optarg; break; case 'n': packet_num=atoi(optarg); break; case 'c': printf("%s\n",optarg); strcat(mtest_pt,"data/"); strcat(mtest_pt,optarg); printf("%s\n",mtest_pt); strcat(mtest_pt,".pt"); break; case '?': fprintf(stderr,"invalid parameter \n"); usage(); break; } } put_buf(mtest_pt);jd; if(packet_size==0) exit(0); send_packet(buffer); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -