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次修改后,每一个路由器都得到了全局路由信息!

用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、付费专栏及课程。

余额充值