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

📄 senser.c~

📁 一个基于linux平台下利用SOCK raw 通信的例子 很好哦
💻 C~
字号:
/*==============programe description==============*//*		程序名称: 	senser.c							*//*              作	 者 :        lvminqiang                   				*//*=========================================*//*===========定义头文件和用到的全局变量===============*/#include"senser.h"/*=============声明使用到的函数=================*/void add(int sockfd,struct sockaddr_in *addr,Link head);void delete(int sockfd,struct sockaddr_in *addr,Link head );//void empty(int sockfd,struct sockaddr_in *add,Link head);void display(Link head);int search(Link head,char *IPaddr,char *mask);int main(int argc, char * argv[]){	/*定义套接字sockid和套接字地址 AS2_addr,serv_add*/	int 		sockid;	 struct sockaddr_in 		AS2_addr, AS1_addr;	char 	select='a';/*用于控制循环,*/	/*===定义头指针hdr,保存全局的IP,=======*/	Link		head;		char		atuactor_ip[16];	if   ( (head=(Link)malloc(sizeof(Node)))==NULL)	{		printf("Memory alloc faile111r!\n");		exit(1);	}	head->IP=inet_addr("0.0.0.0");/*head 头指针,不保存任何IP,初始化为0.0.0.0的样式*/	head->MASK=inet_addr("0.0.0.0");/*同上*/	head->OPR=htonl(ADD);	head->next=NULL;	/*=================创建套接字注意要把套接字的创建放在while循环里面要不然,=================*/	if( (sockid=socket(AF_INET, SOCK_RAW, 254) ) <0)	{		printf("Server :Can not open a data gram socket!\n");		exit(1);	}	printf("enter atuactor IP :\n");	scanf("%s",atuactor_ip);	/*=============初始化套接字地址=================*/	bzero( (char *) &AS1_addr, sizeof(AS1_addr));/*将套接字的地址清零*/	AS1_addr.sin_family=AF_INET;	AS1_addr.sin_addr.s_addr=inet_addr(atuactor_ip);	//AS1_addr.sin_port=htons(DEST_PORT);	/*=============客户端======================*/	bzero((char *) &AS2_addr, sizeof(AS2_addr));	AS2_addr.sin_family=AF_INET;	AS2_addr.sin_addr.s_addr=htonl(INADDR_ANY);  	//AS2_addr.sin_port=htons(SOUR_PORT);	/*==============绑定client端套接字端口====================*/	if(bind (sockid, (struct sockaddr_in *) &AS2_addr, sizeof(AS2_addr))<0)	{		printf("Client: can not bind!\n");		exit(1);	}	/*=============选择界面===================*/	while(select!= '0')	{				printf("*********************************************************************\n");		printf("*	please enter your select !                                   *\n");		printf("*	1: Add  new IP 			  2 : Delete IP	             *\n");		printf("*	3: Empty the Table		  4: display the table 	     *\n");		printf("*	0: exit							     *\n");		printf("**********************************************************************\n");		scanf("%s", &select);/*定义全局头指针hdr,保存存在的IP,全局变量COUNT保存存在的IP的个数*/		switch(select)		{			case '1':		add(sockid,&AS1_addr,head);break;			case '2':		delete(sockid,&AS1_addr,head);break;			//case '3':		empty(sockid,&AS1_addr,head);break;			case '4':		display(head);break;			case '0':		break;			default:		printf("your select are wrong!select again\n");break;		}	}	close(sockid);	return 0;/*定义全局头指针hdr,保存存在的IP,全局变量COUNT保存存在的IP的个数*/}/*=================定义输入函数,输入IP地址=====================*/void add(int sockfd,struct sockaddr_in *addr,Link head){	int		counto;	char  	buffer[NUMBER];/*定义缓存,保存将要发送的数据*/	struct TP		* tp;/*自定义协议结构的指针*/	int 		data_len;/*记录发送数据的长度*/	Link		newp;/*定义连表结构体指针*/	Link		work_p;/*定义工作指针*/		work_p=head;	/*=======工作指针指向连表的最后一项,方便后面的插入==========*/	while(work_p->next!=NULL)	{		work_p=work_p->next;	}	/*===暂存输入IP,255.255.255.255,每个数据包括点号占一个字符,最后一个是'\0',	有系统只动加上,占一个字符共需16个字符===*/	char		IPADD[16];	char		MASK[16];	tp=(struct TP*)buffer;/*将缓存数组,转换成自定义协议的结构*/	bzero(buffer,NUMBER);/*将缓存清零*/	int		n=0;/*记录输入的IP的个数*/	int 		i;	/*============初始化数据的头部==============*/	tp->count=0;/*count 还保持主机字节,应为后面要对它运算*/	//tp->opr=htonl(ADD);	tp->id=htonl(ID);      	/*====注意 :  choice 要有初始化为 "y',否则下次在调用 add(),时由于保留了上次的结果"n"而直接跳过循环=======*/	char		choice='y';/*选择标志*/	char		c;	/*===========输入IP,可输入多个,暂存在缓存区中,输入完,一次性发送================*/	while(choice!='n')	{		if(choice=='y')		{			bzero(IPADD,16);/*清零,清除上次输入的数据*/			printf("please enter the IP address\n");			printf("enter 'exit'  to quik\n\n");			printf("[0.0.0.0<I P<255.225.255.255]	:");			scanf("%s",IPADD);			if( (strcmp(IPADD,"exit"))==0  )			break;			printf("please enter the MASK--ENTER FOR 255.255.255.0 \n");			printf("[255.0.0.0<MASK<255.225.255.0]	:");			/*如果输入回车键,侧默认输入为255.255.255.0*/			getchar();			if( (c=getchar())=='\n')			strcpy(MASK,"255.255.255.0");			else			{				MASK[0]=c;				scanf("%s",(MASK+1));							}						/*===============判断输入的IP和存在的IP的匹配==========*/			if(search(head,IPADD,MASK)==0)			{				printf("the IP you enter has exist\n");				continue;			}			/*==============将输入的数据保存在自定义的协议结构中*/			(tp->ipMask[n]).IP=inet_addr(IPADD);/*将字符性的IP地址格式转换成32位的ip,*/			tp->ipMask[n].MASK=inet_addr(MASK);/*将字符性的MASK地址格式转换成32位形式,*/			tp->ipMask[n].OPR=htonl(ADD);			tp->count++;			n++;			//n++;/*n增加两次,记录数组addr[],中数据的个数是tp->count 的两倍*/			/*======结构体连表指针申请内存空间==============*/			if( (newp=((Link)malloc(sizeof(struct List))))==NULL)			{				printf(" Memory alloc  failer!\n");				exit(1);			}			/*=============初始化newp=================*/			newp->IP=inet_addr(IPADD);			newp->MASK=inet_addr(MASK);			newp->OPR=htonl(ADD);			newp->next=NULL;			/*===========将新的结点插入到连表的尾部==========*/			work_p->next=newp;			work_p=newp;		}		else		{			printf("your enter are wrong!\n\n\n");		}		printf("do you want enter more IP \nYES(y)\nNO(n)\n");		scanf("%s",&choice);	  }	/*===如果没有输入的IP 下面的跳过===============*/	if(n==0)	return;	printf("the new IP you enter is:\n");	printf("***********************************\n");	for(i=0;i<n;i=i+1)	{		printf("I  P	%s\n",inet_ntoa(tp->ipMask[i].IP));		printf("MASK	%s\n",inet_ntoa(tp->ipMask[i].MASK));	}	data_len=sizeof(u_long)*(2+tp->count*3);/*数据包的大小*/	/*MAC最小长度64,否则会被路由器丢弃,IP ,20,mac 头,14,所以data_len>=30*/	if(data_len<30)	data_len=30;/*后面填的是0,前面用bzero*/	/*===============将count的主机字节顺序转化为网络字节============*/	tp->count=htonl(tp->count);	counto=sendto(sockfd,buffer,data_len,0,addr,sizeof(struct sockaddr_in));/*发送*/	if(counto<0)	{		printf("sendto  error!\n");	}	if(counto!=data_len)	{		printf("the data len you send not match the data len you want to send!\n");	}	}/*============定义函数delete()================*//*		功能		删除存在的IP				    		   *//*=======================================*/void delete(int sockfd,struct sockaddr_in *addr,Link head){		int		counto;	char  	buffer[NUMBER];/*定义缓存,保存将要发送的数据*/	struct TP		* tp;/*自定义协议结构的指针*/	int 		data_len;/*记录发送数据的长度*/	Link		newp;/*定义连表结构体指针*/	Link		back_p;/*记录前一个指针*/	Link		work_p;/*定义工作指针*/	work_p=head;	/*===暂存输入IP,255.255.255.255,每个数据包括点号占一个字符,最后一个是'\0',	有系统只动加上,占一个字符共需16个字符===*/	char		IPADD[16];	char		MASK[16];	tp=(struct TP*)buffer;/*将缓存数组,转换成自定义协议的结构*/	bzero(buffer,NUMBER);/*将缓存清零*/	int 		n=0;/*保存输入IP的个数*/	int 		i;	/*============初始化数据的头部==============*/	tp->count=0;	//tp->opr=htonl(DELE);	tp->id=htonl(ID);	char		choice='y';/*选择标志,choice 有初始化,以免后面输入对下次调用delete()影响*/		char 	c;	/*===========输入IP,可输入多个,暂存在缓存区中,输入完,一次性发送================*/	while(choice!='n')	{      		if(choice=='y')		{			bzero(IPADD,16);/*清除上次输入的“exit”记录  ,不影响下次判断*/			printf("please enter the IP address which you want to delete\n");			printf("If you enter 'exit'   for quit\n\n");			printf("[0.0.0.0<I P<255.225.255.255]	:");			scanf("%s",IPADD);			if( (strcmp(IPADD,"exit"))==0  )			break;			printf("please enter the MASK--ENTER FOR 255.255.255.0 \n");			printf("[255.0.0.0<MASK<255.225.255.0]	:");			/*如果输入回车键,侧默认输入为255.255.255.0*/			getchar();			if( (c=getchar())=='\n')			strcpy(MASK,"255.255.255.0");			else			{				MASK[0]=c;				scanf("%s",(MASK+1));							}			/*			printf("please enter the MASK \n");			printf("[255.0.0.0<MASK<255.225.255.0]	:");			scanf("%s",MASK);			*/			/*			if( (search(head,IPADD,MASK))==1)			{				printf(" the IP you enter are not exit!\n");				continue;			}			*/			/*=========将删除的IP保存在自定义的协议的结构中===========*/			tp->ipMask[n].IP=inet_addr(IPADD);/*将字符性的IP地址格式转换成32位的ip,*/			tp->ipMask[n].MASK=inet_addr(MASK);/*将字符性的MASK地址格式转换成32位形式,*/			tp->ipMask[n].OPR=htonl(DELE);			tp->count++;			n++;			//n++;/*n增加两次,记录数组addr[],中数据的个数是tp->count 的两倍*/			/*============进行删除操作==================*/			work_p=head;			back_p=head;			while(1)			{				/*===========IP 不存在===============*/				if(work_p->next==NULL)				{					printf("the IP you enter not exist!\n");					break;				}				/*==========找出匹配的结点================*/		       	 /*IP 不可能和头结点匹配,因为头结点是固定的,不用判定头结点的情况*/				if( ( (strcmp(inet_ntoa((work_p->next)->IP),IPADD))==0)&&(strcmp((inet_ntoa(work_p->next->MASK)),MASK)==0) )							{					work_p=work_p->next;					back_p->next=work_p->next;					free(work_p);					break;				}				else				work_p=work_p->next;				back_p=back_p->next;			}		}		else		{			printf("your enter are wrong !\n\n");		}			printf("do you want enter more IP:( n  for  exit       other for  enter more )\n");			scanf("%s",&choice);			}	/*======如果没有要删除的IP 下面的不之zhi 行===========*/	if(n==0) return;	printf("the new IP you want to delete  is:\n");	printf("***********************************\n");	for(i=0;i<n;i=i+1)	{		printf("I  P	%s\n",inet_ntoa(tp->ipMask[i].IP));		printf("MASK	%s\n",inet_ntoa(tp->ipMask[i].MASK));			}	data_len=sizeof(u_long)*(2+tp->count*3);/*数据包的大小*/	/*MAC最小长度64,否则会被路由器丢弃,IP ,20,mac 头,14,所以data_len>=30*/	if(data_len<30)	data_len=30;/*后面填的是0,前面用bzero*/	/*===============将count的主机字节顺序转化为网络字节============*/	tp->count=htonl(tp->count);	counto=sendto(sockfd,buffer,data_len,0,addr,sizeof(struct sockaddr_in));/*发送*/	if(counto<0)	{		printf("sendto  error!\n");	}	if(counto!=data_len)	{		printf("the data len you send not match the data len you want to send!\n");	}	printf("send ok\n");}/*============定义函数empty()=================*//*		功能		将存在的IP地址全部删除		    		   *//*=======================================*//*============定义函数diaplay=================*//*		功能		将存在的IP地址全部输出  		    		   *//*=======================================*/void display(Link head){		Link work_p;/*定义工作指针*/	work_p=head->next;/*head 结点保存的是0.0.0.0 不输出*/	if((head->next)==NULL)	{		printf("连表为空,没有IP\n");		return;	}	printf("**********************************\nThe total IP are:\n");	/*============将连表输出===========*/	while(work_p!=NULL)	{		printf("IP  	%s\n",inet_ntoa(work_p->IP));		printf("MASK	%s\n",inet_ntoa(work_p->MASK));		work_p=work_p->next;	}}/*============定义函数seaarch()================*//*		功能		判断输入的IP和存在的IP有没有冲突    		   *//*=======================================*/int search(Link head ,char *IPaddr,char *mask){	Link	work_p;/*定义工作指针*/	work_p=head->next;	while(work_p!=NULL)	{		if( (strcmp((inet_ntoa(work_p->IP)),IPaddr)==0) &&(strcmp((inet_ntoa(work_p->MASK)),mask)==0)  )/*输入的IP和存在的IP匹配*/		return 0;		else		work_p=work_p->next;		}	return 1;/*没有匹配的,返回1 */	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -