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;irr_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;iMAXROUTENUM) 
			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