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

📄 rout.c

📁 一个基于linux平台下利用SOCK raw 通信的例子 很好哦
💻 C
字号:
/*==============programe description==============*//*		程序名称: 	rout .c							*//*              作	 者 :        lvminqiang                   				*//*=========================================*//*===========定义头文件和用到的全局变量===============*/ #include"inet.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和套接字地址 cli_addr,serv_add*/	int 	sockid,newsockid;	struct sockaddr_in AS1_addr, rout_addr;	int  counti,counto;	char		buffer[NUMBER];	struct TP *tp;	int		servlen;/*cli_addr 地址的长度*/	u_long	oprate;/*判断输入的报文的操作里=类型,是ADD 还是DELE,还是EMP*/	/*===定义头指针hdr,保存全局的IP,头结点不会删除=======*/	Link		head;	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->next=NULL;	/*=================创建套接字=================*/	if((sockid=socket(AF_INET, SOCK_RAW,254))==-1)	{		printf("Rout: can not construct a saw socket!\n");		exit(0);	}	/*=============初始化套接字地址=================*/	bzero((char *) &rout_addr, sizeof(rout_addr));	rout_addr.sin_family=AF_INET;	rout_addr.sin_addr.s_addr=htonl(INADDR_ANY);	rout_addr.sin_port=htons(ROUT_PORT);	/*=======绑定server端套接字=====================*/	if(bind(sockid, (struct sockaddr_in *)&rout_addr, sizeof(rout_addr))<0)	{		fprintf(stderr, "Rout: not bind!\n");		exit(1);	}	/*=======大开端口,接受数据================*/	while(1 )	{			bzero(buffer,NUMBER);		servlen=sizeof(struct sockaddr_in);                printf("wait for datagram!\n");		counti=recvfrom(sockid, buffer, strlen(buffer)+128, 0,&AS1_addr,&servlen);		if(counto<0)		{			printf("send to route error!");		}		tp=(struct TP*)(buffer+20);/*将缓存数组,转换成自定义协议的结构*/		oprate=ntohl(tp->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*2;i=i+2)	{		/*======结构体连表指针申请内存空间==============*/		if( (newp=((Link)malloc(sizeof(struct List))))==NULL)		{			printf(" Memory alloc  failer!\n");			exit(1);		}		/*=============初始化newp=================*/		newp->IP=inet_addr( inet_ntoa(tp->addr[i]));		newp->MASK=inet_addr(inet_ntoa(tp->addr[i+1]));		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*2;i=i+2)	{	        /*============进行删除操作==================*/		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->addr[i]) &&((work_p->next)->MASK==tp->addr[i+1])  )			{				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 empty(Link head){		Link		work_p;/*定义工作连表指针*/	Link		temp_p;/*临时指针,初始为 head->next*/	temp_p=head->next;	/*==*将头结点的next 指针为NULL,保留头结点,标识后面的查询,如果判断head->next==NULL 侧连表为空*/	head->next=NULL;	/*========将连表删除,在删除完后仍然保留头结点 ============*/	while(temp_p!=NULL)	{		work_p=temp_p;		temp_p=temp_p->next;		free(work_p);	}}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 + -