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);
		
}