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