📄 rout.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 + -