www.pudn.com > src00 > LINU.C, change:2002-02-19,size:8623b
#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 6
char 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);
}