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

📄 linu.c

📁 一个linux下面的几个网络程序
💻 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 + -