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