資源簡介
RIP協議是一種動態路由協議。RIP協議基于距離矢量算法。使用“跳數”來衡量到達目標地址的路由距離,實現RIP協議
代碼片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include?
#include?
using?namespace?std;
?
const?int?maxR=6;//路由器數量
?typedef?__int64?ll;
//路由表項
struct?RIP{
char?name;//本路由器名稱
int?N;//到目的網絡N
int?d;//距離d
char?X;//下一跳路由器
bool?is_valid;//是否有效,即可達
RIP(){is_valid=true;}
ll??time;//上次更新時間
};
?
//發送的報文
vector?Send(vector?rchar?c){
for(int?i=0;i r[i].d++;//到所有目的網絡距離加1
r[i].X=c;?//下一跳改為現在的路由器名稱
time_t?now_time;?
now_time?=?time(NULL);?
r[i].time?=?now_time;?//發送的時間
}
return?r;
}
?
vector?rip[maxR];//路由表?相當于RIP?rip[maxR]創建一個結構體動態數組對象
char?idToRname[]=“ABCDEF“;//int編號改為字母標號?0-A?1-B?2-C?3-D?4-E?5-F
vector?ve[maxR];//一個vector包含多條記錄是一個路由表?ve則可表示路由器分布圖鄰接表
?
//打印路由表
void?printR(char?x){
????int?j?=?x-‘A‘;
vector?r;
r=rip[j];
cout<<“<----------------------路由表“<“< cout<<“到目的網絡N\t\t距離d\t\t下一跳路由器X“< for(?int?i=0;i cout< }
}
?
//用文件root的內容更新各個路由器
void?init(char*?file){
fstream?infile(file);
if(!infile.is_open())?cout<<“未成功打開文件!“< int?N;
char?name;
RIP?rp;
infile>>N;//路由器數量
for(int?i=0;i infile>>name;//路由器名稱
rp.name=name;
while(infile>>rp.N>>rp.d>>rp.X&&rp.N){
time_t?now_time;?
now_time?=?time(NULL);?
rp.time?=?now_time;
rip[i].push_back(rp);//在數組的最后添加一個數據
}
}
infile.close();
}
?
//用鄰接表初始化網絡結構圖
void?initve(char*?file){
fstream?infile(file);
if(!infile.is_open())?cout<<“未成功打開文件!“< char?vv1;
while(infile>>v){//第一個是當前結點?后面的都是當前結點的鄰接點
while(infile>>v1&&v1!=‘0‘){
ve[v-‘A‘].push_back(v1);
}
}
infile.close();
}
?
//打印圖
void?printG(){
cout<<“<----------------------網絡拓撲結構---------------------->“< for(int?i=0;i cout< for(int?j=0;j cout< if(j cout<<“?“;
}
cout< }
}
?
//路由表排序依據
bool?cmp(RIP?r1RIP?r2){
return?r1.N }
?
//正式發送更新報文更新路由表
bool?update(){
bool?hasEdit=false;//本次更新有無修改
vector?send;//創建一個即將發送的報文
vector?rip1[maxR];//創建新的路由表用來保存未更新的路由表
for(int?i=0;i rip1[i]=rip[i];
//遍歷每個路由結點
?for(?i=0;i send=Send(rip[i]i+‘A‘);//向鄰居發送的路由更新報文
for(int?j=0;j //遍歷第i個路由器的所有鄰居?目的就是更新鄰居
//本次給鄰居ve[i][j]?一個序號
int?lid=ve[i][j]-‘A‘;
for(int?x=0;x //遍歷發過來的更新報文
int?k;
//檢查篩選時要篩選新的
for(k=0;k //遍歷鄰居路由表?查找更新報文的每一條
//rip1[lid]是第lid個路由表??rip1[lid][k]是第lid個路由表的第k條記錄
if(send[x].d!=16?&&?rip1[lid][k].d!=16)
{
if(send[x].N==rip1[lid][k].N){//目的地址相同
if(send[x].X==rip1[lid][k].X){//下一跳相同
if(rip1[lid][k].d!=send[x].d){//N?X?都相同??d不同?更新
rip1[lid][k]=send[x]
評論
共有 條評論