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

📄 atuactor.c~

📁 一个基于linux平台下利用SOCK raw 通信的例子 很好哦
💻 C~
字号:
/*==============programe description==============*//*		程序名称: 	atuactor.c							*//*              作	 者 :        lvminqiang                   				*//*=========================================*//*===========定义头文件和用到的全局变量===============*/ #include"atuactor.h"void add(Link head,char *buffer);void delete(Link head,char *buffer);//void empty(Link head);void display(Link head);int  main(int argc ,char *argv[]){	/*定义套接字sockid和套接字地址 AS2_addr,serv_add*/	int 	sockid,sockfd;	struct sockaddr_in AS2_addr, AS1_addr,rout_addr;	int  counti,counto;	char		buffer[NUMBER];	char		*buf;/*指向buffer的第20个字节,去掉接受端的ip头,在 发给路由器*/	int		rout_data_len;/*发送给路由器的数据的长度*/	struct TP *tp;	int		clilen;/*AS2_addr 地址的长度*/	u_long	oprate;/*判断输入的报文的操作里=类型,是ADD 还是DELE,还是EMP*/	/*===定义头指针hdr,保存全局的IP,头结点不会删除=======*/	Link		head;	char		rout_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;	/*=================创建套接字=================*/	if((sockid=socket(AF_INET, SOCK_RAW,254))==-1)	{		printf("Server: can not construct a stream socket!\n");		exit(0);	}	/*==================创建发往路由器的套接字==================*/	if((sockfd=socket(AF_INET, SOCK_RAW,254))==-1)	{		printf("Cli_Server: can not construct a socket to route!\n");		exit(0);	}//输入senser,atuactor router的IP地址	 printf("enter router IP:\n");	 scanf("%s",rout_ip);	/*=============初始化套接字地址=================*/	bzero((char *) &AS1_addr, sizeof(AS1_addr));	AS1_addr.sin_family=AF_INET;	AS1_addr.sin_addr.s_addr=htonl(INADDR_ANY);	//AS1_addr.sin_port=htons(DEST_PORT);	/*=============初始化套接字地址-路由器端的=================*/	bzero((char *) &rout_addr, sizeof(AS1_addr));	rout_addr.sin_family=AF_INET;	rout_addr.sin_addr.s_addr=inet_addr(rout_ip);	//rout_addr.sin_port=htons(rout_ip);		/*=======绑定server端套接字=====================*/	if(bind(sockid, (struct sockaddr_in *)&AS1_addr, sizeof(AS1_addr))<0)	{		fprintf(stderr, "Server: Can not bind!\n");		exit(1);	}	/*=======大开端口,接受数据================*/	while(1 )	{			bzero(buffer,NUMBER);		clilen=sizeof(struct sockaddr_in);                printf("wait for datagram!\n");		counti=recvfrom(sockid, buffer, strlen(buffer)+128, 0,&AS2_addr,&clilen);		if(counti>0)		printf("receive data!\n");		/*==========向路由器发送==========================*/		buf=buffer+20;/*指向buffer的第20个字节,去掉接受端的ip头,在 发给路由器*/		rout_data_len=counti-20;/*去掉IP头的长度*/		counto=sendto(sockid,buf,rout_data_len,0,& rout_addr,sizeof(struct sockaddr_in));/*发送给路由器*/		struct TP *wp;		wp=(struct TP *)buf;		if(counto<0)		{			printf("send to route error!");		}		/*==================================================*/		tp=(struct TP*)(buffer+20);/*将缓存数组,转换成自定义协议的结构*/		oprate=ntohl(tp->ipMask[0].OPR);		if(counti<0)		{			printf("recvfrom error!\n");		}		else		printf("receive ok\n");		switch(oprate)		{			case ADD:    	add(head,buffer);display(head);break;				case DELE:	delete(head,buffer);display(head);break;			//case EMP:	empty(head);display(head);break;			default :		printf("the datagram received not right!\n");break;		}	    }				close(sockid);		exit(0);}void add(Link head,char *buffer){	struct TP  *tp;	Link		newp;/*定义连表结构体指针*/	Link		work_p;/*定义工作指针*/	u_long	n=0;/*记录报文中IP地址的个数*/	int 		i;/*循环控制用*/	work_p=head;	/*=======工作指针指向连表的最后一项,方便后面的插入==========*/	while(work_p->next!=NULL)	{		work_p=work_p->next;	}	tp=(struct TP *)(buffer+20);	n=ntohl(tp->count);/*记录发过来的IP和mask对的个数*/	for(i=0;i<n;i=i+1)	{		/*======结构体连表指针申请内存空间==============*/		if( (newp=((Link)malloc(sizeof(struct List))))==NULL)		{			printf(" Memory alloc  failer!\n");			exit(1);		}		/*=============初始化newp=================*/		newp->IP=inet_addr( inet_ntoa(tp->ipMask[i].IP));		newp->MASK=inet_addr(inet_ntoa(tp->ipMask[i].MASK));		newp->OPR=inet_addr(inet_ntoa(tp->ipMask[i].OPR));		newp->next=NULL;		/*===========将新的结点插入到连表的尾部==========*/		work_p->next=newp;		work_p=newp;	}	}void delete(Link head ,char *buffer){	struct TP  *tp;	Link		newp;/*定义连表结构体指针*/	Link		work_p;/*定义工作指针*/	Link		back_p;/*记录前一个指针*/	u_long	n=0;/*记录报文中IP地址的个数*/	int 		i;/*循环控制用*/	tp=(struct TP *)(buffer+20);	n=ntohl(tp->count); 	for(i=0;i<n;i=i+1)	{	        /*============进行删除操作==================*/		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( ((work_p->next)->IP==tp->ipMask[i].IP) &&((work_p->next)->MASK==tp->ipMask[i].MASK)  )			{				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;		    }		}}void display(Link head){	Link work_p;/*定义工作指针*/	work_p=head->next;/*head 结点保存的是0.0.0.0 不输出*/	if((head->next)==NULL)	{		printf("***********************************\n");		printf("连表为空,没有IP\n");		return;	}	printf("***********************************\nThe total IP are:\n");	/*============将连表输出===========*/	while(work_p!=NULL)	{		printf("I  P	%s\n",inet_ntoa(work_p->IP));		printf("MASK	%s\n",inet_ntoa(work_p->MASK));		work_p=work_p->next;	}}

⌨️ 快捷键说明

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