用C語言實現距離向量演算法的過程模擬
阿新 • • 發佈:2019-02-20
計算機網路的實驗作業拖了好久了,內容是模擬RIP協議,一直想用純面向過程的思路來寫,其中原因並非不喜歡面向物件,而是博主的Java忘的差不多了。。。
今天下午吐血寫完,功能實現的不是很好,沒寫多路由器自由互動,算了,半自由互動勉強可以用
程式碼如下:
#include <stdio.h> #include <string.h> //定義路由表結構RTable typedef struct node{ char dstNet[5]; int distance; char nextSkip[5]; }RTable; RTable RT1[1000];//當前路由器路由表 RTable RT2[1000];//相鄰路由器的路由表 RTable RT3[1000]; int i,l1,l2,l3; char nearR1[5],nearR2[5]; //基於當前路由器的路由表初始化函式 void InitRTable( RTable* RT ){ printf("請為當前路由器新增路由表項(目的網路 距離 下一跳路由器):\n"); for( i=0;i<1000;++i ){ scanf("%s%d%s",RT[i].dstNet,&RT[i].distance,RT[i].nextSkip); if( RT[i].distance==0 ){ break; } } l1 = i;//記錄RT1[]的長度 } //相鄰路由器新增函式 void AddNearRouter(){ printf("\n請輸入第一個相鄰路由器名稱:\n"); scanf("%s",nearR1); printf("請輸入第二個相鄰路由器名稱:\n"); scanf("%s",nearR2); } //基於相鄰路由器的路由表初始化函式 void InitNearRTable(){ printf("\n請為相鄰路由器%s新增路由表項(目的網路 距離 下一跳路由器):\n",nearR1); for( i=0;i<1000;++i ){ scanf("%s%d%s",RT2[i].dstNet,&RT2[i].distance,RT2[i].nextSkip); if( RT2[i].distance==0 ){ break; } } l2 = i;//記錄RT2[]的長度 printf("\n請為相鄰路由器%s新增路由表項(目的網路 距離 下一跳路由器):\n",nearR2); for( i=0;i<1000;++i ){ scanf("%s%d%s",RT3[i].dstNet,&RT3[i].distance,RT3[i].nextSkip); if( RT3[i].distance==0 ){ break; } } l3 = i;//記錄RT3[]的長度 } //路由表更新函式 void UpdateRTable( RTable* RT1,RTable* RT2,char* nearR ){ int p,q;//p——RT2[],q——RT1[] for( p=0;p<l2;++p ){ int finded=0; for( q=0;q<l1;++q ){ if( strcmp( RT2[p].dstNet,RT1[q].dstNet )==0 ){//當前表中找到與發來的表目的網路相同的一條路由資訊 finded = 1; if( strcmp( RT1[q].nextSkip,nearR )==0 ){//下一跳路由器正好是這個相鄰路由器 RT1[q].distance = RT2[p].distance + 1; } else{//下一跳路由器不是這個 if( RT2[p].distance+1<RT1[q].distance ){ RT1[q].distance = RT2[p].distance + 1; strcpy( RT1[q].nextSkip,nearR ); } } } } if( !finded ){//當前表中沒有這條路由資訊,就加上 strcpy( RT1[l1].dstNet,RT2[p].dstNet ); RT1[l1].distance = RT2[p].distance + 1; strcpy( RT1[l1].nextSkip,nearR ); ++l1; } } } void Print1(){ printf("\n----------當前路由器的路由表---------\n"); } void Print2(){ printf("\n----------相鄰路由器的路由表---------\n"); } //路由表列印函式 void PrintRTable( RTable* RT,int len ){ printf(" 目的網路 距離 下一跳路由器\n"); for( i=0;i<len;++i ){ printf(" %s %d %s\n",RT[i].dstNet,RT[i].distance,RT[i].nextSkip); } printf("-------------------------------------\n"); } //路由表更新函式 void Choose_Update(){ printf("\n請選擇一個傳遞更新資訊的相鄰路由器(1 or 2):\n"); int choose; scanf("%d",&choose); if( choose==1 ){ UpdateRTable(RT1,RT2,nearR1); } else if( choose==2 ){ UpdateRTable(RT1,RT3,nearR2); } printf("\n-------當前路由器更新後的路由表------\n"); PrintRTable(RT1,l1); } int main() { printf("\n-----------距離向量演算法的過程模擬------------\n\n"); //初始化當前路由器 InitRTable(RT1); //新增相鄰路由器 AddNearRouter(); //初始化相鄰路由器 InitNearRTable(); //列印當前路由表 Print1(); PrintRTable(RT1,l1); //列印相鄰路由表 Print2(); PrintRTable(RT2,l2); Print2(); PrintRTable(RT3,l3); //進行路由表更新 Choose_Update(); }