计网:RIP路由协议(c语言)

#include <stdio.h>
#include <windows.h>
#include <time.h>
typedef struct RoutTable{//定义路由表 
	unsigned char tn; 	//目的网络地址 
	unsigned char d; 	// 距离 
	char next;			//下一跳路由 
}RTable;
void insertTable(RTable rt[], int *count, unsigned char tn, 
			unsigned char d, char next); 
void init(RTable rt[],int *count);
void prt(RTable rt[], int count);
void updateRIP(RTable rt[],int *count,RTable rtu[], int *count2);
void receiveRIP(RTable rt[], int *count);
int main(){
	RTable rt[100], rtu[100]; 
	//rt表示我们需要维护的本地路由器,路由表最多有100条表项目 
	//rtu表示接收到的相邻路由器的路由表 
	int count = 0, count2 = 0; //分别表示rt和rtu两个路由器实际的路由数 
	init(rt,&count); //对路由器rt进行初始化,count采用地址传递方式 
	prt(rt,count); //打印路由器表rt 
	while(1){ 
		Sleep(3000); //每间隔3000ms就更新一次路由器(模式周期更新,实际的算法要求30ms更新一次) 
		receiveRIP(rtu,&count2); //收到来自相邻路由器的路由表 
		printf("接收到的路由信息:\n"); 
		prt(rtu,count2);
		updateRIP(rt,&count,rtu,&count2);
		printf("更新后的路由信息:\n"
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用C写的rip协议 这是其中的广播request程序片段: void RouteInit() { int i,optval=0,length,error; routeNum = 0; // init local socket address and ip address GetLocalIP(); // init route table items for(i = 0; i < MAX_NUM; i++) { SetRouteEntry(&routeTable[i].routeInfo,"0.0.0.0",0,0); routeTable[i].isvalid = 0; routeTable[i].timer = 0; routeTable[i].statue = 0; inet_aton("0,0,0,0",&routeTable[i].sourceIPAddr); } // init request packet SetRoutePacket(&reqPacket,REQUEST); SetRouteEntry(&reqPacket.routeEntry[0],"0.0.0.0",0,16); // init response packet SetRoutePacket(&resPacket,RESPONSE); recvSockAddr.sin_family = AF_INET; recvSockAddr.sin_port = htons(PORT); recvSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); sendSockAddr.sin_family = AF_INET; sendSockAddr.sin_port = htons(PORT); // inet_aton("240.255.255.255",&sendSockAddr.sin_addr); sendSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); EntryInit(); sock = socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { printf("cannot create a socket!\n"); exit(1); } if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(int)) != 0) { printf("cannot broadcast!\n"); close(sock); exit(1); } if(bind(sock,(struct sockaddr*)&recvSockAddr,sizeof(recvSockAddr))<0) { printf("cannot bind to port\n"); close(sock); exit(1); } length=sizeof recvSockAddr; getsockname(sock,(struct sockaddr*)&recvSockAddr,&length); printf("Port %d is opened. Listen for packet...\n",ntohs(recvSockAddr.sin_port)); FD_ZERO(&fdSet); FD_SET(sock,&fdSet); error = sendto(sock,&reqPacket,4+sizeof(struct ROUTE_ENTRY),0,(struct sockaddr*)(&sendSockAddr),sizeof(struct sockaddr)); if(error<0) { PrintEntry(&reqPacket.routeEntry[0]); printf("broadcast request packet failed! %d,%d,%d\n",error,sock,fdSet); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值