www.pudn.com > ripin.rar > ripin.c
#include#include #include #include #include #include #include #include #define RIPHSIZE 4 #define RIP_VERSION 1 #define RIP_REQUEST 1 #define RIP_RESPONSE 2 #define RIP_PORT 520 typedef struct { unsigned short rr_family; unsigned short rr_mbz1; struct in_addr rr_ipa; unsigned int rr_mbz2; unsigned int rr_mbz3; unsigned int rr_metric; }riprt; #define MAXRIPROUTES 25 #define RIP_INFINITY 16 #define RIPRTTL 12 #define RIPZTIME 18 #define RIPINT 30 typedef struct { char rip_cmd; char rip_vers; unsigned short rip_mbz; riprt rip_rts[MAXRIPROUTES]; }rip; #define MAXROUTENUM 100 #define RT_INF 999 typedef struct { riprt rt_route; unsigned long rt_gw; int rt_isvalid; long rt_ttl; int rt_status; }routelist; rip replPacket; rip recvPacket; riprt *rTable; rip reqPacket; routelist myList[MAXROUTENUM]; int routeNum; int sock; struct sockaddr_in to, from, server; fd_set rfds; struct timeval timer; long timeoff; void newRoute(riprt* rt_route, char* ipAddr,unsigned short newAFI, unsigned int newMetric) { rt_route->rr_family=htons(newAFI); rt_route->rr_mbz1=0; inet_aton(ipAddr,&rt_route->rr_ipa); rt_route->rr_mbz2=0; rt_route->rr_mbz3=0; rt_route->rr_metric=htonl(newMetric); } void printRoute(riprt *rt_route) { printf("Address Family Identifier: %d\n",ntohs(rt_route->rr_family)); printf("IPv4 Address: %s\n",inet_ntoa(rt_route->rr_ipa)); printf("Metric: %d\n",ntohl(rt_route->rr_metric)); printf("\n"); } void printList() { int i; printf("Num\tIP\t\tAFI\tMetric\tStatus\tNexthop\n"); for(i=0;i rr_family=s->rr_family; d->rr_ipa.s_addr=s->rr_ipa.s_addr; d->rr_metric=s->rr_metric; } int readFile(char* filename) { FILE * file; file=fopen(filename,"r"); if(file==NULL) { printf("File Not Found.\n"); return -1; } char ip[16]; int afi, metric; while(fscanf(file,"%s %d %d\n",ip,&afi,&metric)!=EOF) { newRoute(&rTable[routeNum],ip,afi,metric); newRoute(&myList[routeNum].rt_route,ip,afi,metric); myList[routeNum].rt_ttl=RT_INF; myList[routeNum].rt_isvalid=1; myList[routeNum].rt_status=0; routeNum++; } fclose(file); return 1; } int settimer(void) { int i; for(i=0;i MAXROUTENUM) printf("Out of Route list!\n"); } if(k==0) { printf("Route list is null.\n"); return -1; } error=sendto(sock,&replPacket,RIPHSIZE+k*sizeof(riprt),0,(struct sockaddr*)(&to),sizeof(to)); if(error<0) { printf("Can't broadcast. Error %d\n",error); } return 1; } int riprecv() { int recvLen,len,i,j,m,error; len=recvfrom(sock,&recvPacket,sizeof(recvPacket),0,(struct sockaddr*)&from,&recvLen); printf("%d recieved from %s.\n",len,inet_ntoa(from.sin_addr.s_addr)); if((len-RIPHSIZE)%sizeof(riprt)!=0) { printf("Wrong packet.\n"); return -2; } if(recvPacket.rip_vers!=RIP_VERSION||recvPacket.rip_mbz!=0) { printf("Packet not match.\n"); return -3; } if(recvPacket.rip_cmd==RIP_REQUEST) { //request printf("Request\n"); ripsend(); } else if(recvPacket.rip_cmd==RIP_RESPONSE) { //response printf("Response\n"); for(i=0;i<(len-RIPHSIZE)/sizeof(riprt);i++) { m=ntohl(recvPacket.rip_rts[i].rr_metric); m++; if(m>=RIP_INFINITY) continue; recvPacket.rip_rts[i].rr_metric=htonl(m); for(j=0;j