rip协议c语言实现,RIP协议的距离向量算法实现(c++)

模拟路由表示意图

2db5ef64cbb7022280674963f51b5467.png

核心:

新的直接进表

下一跳不一样要短的

下一跳一样要新的

(应用层的不是网络层的)

算法实现:

#include#include#include#include#include#include#include#includeusing namespace std;

const int maxR=6;//最大路由器数量

//时间间隔辅助函数

typedef long long ll;

ll getNowTime(){//返回秒数

struct timeval tv;

struct timezone tz;

gettimeofday(&tv,&tz);

return tv.tv_sec;//零头的微秒忽略

}

//路由表项

struct RIP{

char name;//本路由器名称

int N;//到目的网络N

int d;//距离d

char X;//下一跳路由器

ll time;//上次更新时间

bool is_valid;//是否有效

RIP(){is_valid=true;}

};

//发送的报文打包

vectorSend(vectorr,char c){

for(int i=0;irip[maxR];//路由表

char idToRname[]="ABCDEF";//int编号改为字母标号 0-A 1-B 2-C 3-D 4-E 5-F

vectorve[maxR];//一个vector包含多条记录是一个路由表 ve则可表示路由器分布图邻接表

//打印路由表

void printR(){

vectorr;

for(int i=0;i>N;

for(int i=0;i>name;//因为按顺序的所以不处理了

rp.name=name;//处理下也行 不过一次处理一次就够了 冗余但安全性高了

while(infile>>rp.N>>rp.d>>rp.X&&rp.N){

rp.time=getNowTime();

rip[i].push_back(rp);

}

}

infile.close();

}

//用领接表初始化网络结构图

void initve(char* file){

fstream infile(file);

if(!infile.is_open()) cout<>v){//第一个是当前结点 后面的都是当前结点的所有邻居 0表示结束

while(infile>>v1&&v1!='0'){

ve[v-'A'].push_back(v1);

}

}

infile.close();

}

//打印图

void printG(){

cout< send;

vectorrip1[maxR];

for(int i=0;i180) rip[i][j].is_valid=false;//180s无更新 标记无效

else if(!rip[i][j].is_valid&&(t1-rip[i][j].time)>120) rip[i].erase(rip[i].begin()+j);//无效后120s无更新 删除

}

}

}

int main(){

// freopen("运行结果.txt","w",stdout);

init("routes.txt");//用文件routes.txt初始化

printR();

initve("netGraphic.txt");//初始化网络拓扑图

printG();

int T=0,n=0;

while(true){

sleep(1);//每隔3秒更新路由表 为了演示运行结果方便不设置为30s秒了

cout<

文件:

netGraphic.txt 网络拓扑图 0代表一行结束

A B D E 0

B A C 0

C B F 0

D A E F 0

E A D F 0

F C D E 0

routes.txt 各个路由表初始状态

6

A

1 1 -

2 1 -

3 1 -

0 0 0

B

3 1 -

4 1 -

0 0 0

C

4 1 -

6 1 -

0 0 0

D

2 1 -

5 1 -

0 0 0

E

1 1 -

5 1 -

0 0 0

F

5 1 -

6 1 -

0 0 0

#第一个数字N表示路由器个数

#N组,每组表示一个路由器表项 每个路由器表项中目的网络为0表示此路由器结束

3个文件要放在同一个文件夹下执行

f6210b9feec9351fb81ec6aa0a90a7f4.png

运行结果:

***********************路由表A************************

到目的网络N距离d下一跳路由器X

11-

21-

31-

***********************路由表B************************

到目的网络N距离d下一跳路由器X

31-

41-

***********************路由表C************************

到目的网络N距离d下一跳路由器X

41-

61-

***********************路由表D************************

到目的网络N距离d下一跳路由器X

21-

51-

***********************路由表E************************

到目的网络N距离d下一跳路由器X

11-

51-

***********************路由表F************************

到目的网络N距离d下一跳路由器X

51-

61-

**********************网络拓扑结构********************

A B D E

B A C

C B F

D A E F

E A D F

F C D E

------------------------第1次更新------------------------

***********************路由表A************************

到目的网络N距离d下一跳路由器X

11-

21-

31-

42B

52D

***********************路由表B************************

到目的网络N距离d下一跳路由器X

12A

22A

31-

41-

62C

***********************路由表C************************

到目的网络N距离d下一跳路由器X

32B

41-

52F

61-

***********************路由表D************************

到目的网络N距离d下一跳路由器X

12A

21-

32A

51-

62F

***********************路由表E************************

到目的网络N距离d下一跳路由器X

11-

22A

32A

51-

62F

***********************路由表F************************

到目的网络N距离d下一跳路由器X

12E

22D

42C

51-

61-

------------------------第2次更新------------------------

***********************路由表A************************

到目的网络N距离d下一跳路由器X

11-

21-

31-

42B

52D

63B

***********************路由表B************************

到目的网络N距离d下一跳路由器X

12A

22A

31-

41-

53A

62C

***********************路由表C************************

到目的网络N距离d下一跳路由器X

13B

23B

32B

41-

52F

61-

***********************路由表D************************

到目的网络N距离d下一跳路由器X

12A

21-

32A

43A

51-

62F

***********************路由表E************************

到目的网络N距离d下一跳路由器X

11-

22A

32A

43A

51-

62F

***********************路由表F************************

到目的网络N距离d下一跳路由器X

12E

22D

33C

42C

51-

61-

------------------------第3次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第4次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第5次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第6次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第7次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第8次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第9次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第10次更新------------------------

本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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); } }
RIP(Routing Information Protocol)是一种基于距离向量算法的路由协议。下面是一个简单的C语言实现RIP的示例: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> //inet_ntoa()函数的头文件 #include <net/if.h> //ifreq结构体的头文件 #include <sys/ioctl.h> //ioctl()函数的头文件 #define MAX_ROUTES 100 //最大路由数 struct route { char prefix[16]; //网络前缀 char nexthop[16]; //下一跳地址 int metric; //距离 }; int main() { struct route routes[MAX_ROUTES]; //路由表 int num_routes = 0; //路由数 //添加初始路由 strcpy(routes[num_routes].prefix, "10.0.0.0"); strcpy(routes[num_routes].nexthop, "192.168.0.1"); routes[num_routes].metric = 1; num_routes++; //获取本机IP地址 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(sockfd, SIOCGIFADDR, &ifr); close(sockfd); char *ip = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr); //开始监听RIP报文 while (1) { //接收RIP报文 char buf[1024]; memset(buf, 0, sizeof(buf)); int len = recvfrom(sock, buf, sizeof(buf), 0, NULL, NULL); //解析RIP报文 for (int i = 0; i < num_routes; i++) { if (strcmp(routes[i].prefix, ip) == 0) { //回复RIP响应报文 char response[1024]; memset(response, 0, sizeof(response)); int pos = 0; response[pos++] = 0x02; //Command字段:响应 response[pos++] = 0x01; //Version字段:RIPv1 response[pos++] = 0x00; //Unused字段:0 response[pos++] = 0x00; //Unused字段:0 for (int j = 0; j < num_routes; j++) { //添加路由项到响应报文中 response[pos++] = 0x00; //Address Family Identifier字段:IPv4 response[pos++] = 0x02; //Route Tag字段:0 memcpy(response+pos, &routes[j].prefix, 4); //IP地址字段 pos += 4; memcpy(response+pos, &routes[j].metric, 4); //Metric字段 pos += 4; } //发送响应报文 sendto(sock, response, pos, 0, NULL, 0); break; } } } return 0; } ``` 这只是一个简单的示例,实际上RIP协议实现还需要考虑很多细节和安全问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值