using System;
using System.Collections.Generic;
using System.Text;
namespace RIP
{
//本程序并不完美,但算法正确,可在此方法上扩展,使用的是C#
//代码冗余较多,各位自己修改下。
//支持N1-R1-N2-R2-N3-R3-N4,R1,R2,R3可随意放,但要按照拓扑结构输入信息
class Program
{
static void Main(string[] args)
{
Console.WriteLine("本程序支持3个路由器组成的串联网络");
R1 a = new R1();
Console.WriteLine();
R2 b = new R2();
Console.WriteLine();
R3 c = new R3();
String[,] RIPA = a.r1;
String[,] RIPB = b.r2;
String[,] RIPC = c.r3;
String[,] RIP1 = a.r1;
String[,] RIP2 = b.r2;
String[,] RIP3 = c.r3;
swapInfo SI = new swapInfo();
Console.WriteLine();
Console.WriteLine("输出路由器的初始化路由表:");
show sh = new show(a.r1,a.RouterName);
sh = new show(b.r2,b.RouterName);
sh = new show(c.r3,c.RouterName);
int count=0;
while (true)
{
count++;
Console.WriteLine("按下任意键查看第"+count+"次更新后的信息:");
Console.ReadKey();
if (a.n == 2)
{
SI.swap(a.RouterName, ref RIP1,
b.RouterName, ref RIP2,
c.RouterName, ref RIP3);
a.r1 = RIP1;
b.r2 = RIP2;
c.r3 = RIP3;
}
if (b.n == 2)
{
SI.swap(b.RouterName, ref RIP2,
a.RouterName, ref RIP1,
c.RouterName, ref RIP3);
a.r1 = RIP1;
b.r2 = RIP2;
c.r3 = RIP3;
}
if (c.n == 2)
{
SI.swap(c.RouterName, ref RIP3,
b.RouterName, ref RIP2,
a.RouterName, ref RIP1);
a.r1 = RIP1;
b.r2 = RIP2;
c.r3 = RIP3;
}
sh = new show(a.r1, a.RouterName);
sh = new show(b.r2, b.RouterName);
sh = new show(c.r3, c.RouterName);
if (a.r1 == RIPA && b.r2 == RIPB && c.r3 == RIPC)
{
if(count==1)
Console.WriteLine("在第" + count +
"次更新后路由表已收敛");
else
Console.WriteLine("在第" + (count - 1).ToString() +
"次更新后路由表已收敛");
break;
}
}
Console.ReadKey();
}
}
/// <summary>
/// 路由器R1
/// </summary>
public class R1
{
public String[,] r1 = new String[5, 3];//记录路由表
public int n = 0; //记录有几个相邻的路由器
public String[] RouterNext = new String[2];//记录相邻路由名
public String RouterName = "R1";
/// <summary>
/// 路由器R1的初始化
/// </summary>
public R1()
{
init INIT = new init();
r1 = INIT.initRouter(RouterName);
RouterNext = INIT.NextRouter(RouterName);
n = INIT.NumberOfNextRouter();
}
}
/// <summary>
/// 路由器R2
/// </summary>
public class R2
{
public String[,] r2 = new String[5, 3];//记录路由表
public String[] RouterNext = new String[2];//记录相邻路由名
public int n = 0;//记录相邻路由器的个数
public String RouterName = "R2";
/// <summary>
/// 路由器R2的初始化
/// </summary>
public R2()
{
init INIT = new init();
r2 = INIT.initRouter(RouterName);
RouterNext = INIT.NextRouter(RouterName);
n=INIT.NumberOfNextRouter();
}
}
/// <summary>
/// 路由器R3
/// </summary>
public class R3
{
public String[,] r3 = new String[5, 3];//记录路由表
public String[] RouterNext = new String[2];//记录相邻路由名
public int n = 0;//记录相邻路由器的个数
public String RouterName = "R3";
/// <summary>
/// 路由器R3的初始化
/// </summary>
public R3()
{
init INIT = new init();
r3 = INIT.initRouter(RouterName);
RouterNext = INIT.NextRouter(RouterName);
n = INIT.NumberOfNextRouter();
}
/// <summary>
/// 返回R3的路由表
/// </summary>
/// <returns></returns>
public String[,] outRIPArray()
{
return r3;
}
}
/// <summary>
/// 输出路由表
/// </summary>
public class show
{
/// <summary>
/// 输出路由表
/// </summary>
/// <param name="r">路由表</param>
/// <param name=" RouterName ">路由器名</param>
public show(String[,] r,String RouterName)
{
String[,] s = new String[1, 3];
Console.WriteLine(RouterName+"/n-------------------------------");
Console.WriteLine("目的网络 | 距 离 | 下 一 跳");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
s[0, j] = r[i, j];
}
if (s[0, 0] != null && s[0, 0].StartsWith("N"))
{
Console.WriteLine(s[0, 0] + " | " + s[0, 1] + " | " + s[0, 2]);
}
}
Console.WriteLine("----------------------------------/n");
}
}
/// <summary>
/// 路由器初始化
/// </summary>
public class init
{
private String[,] RIP = new String[5, 3];//记录初始化时的路由信息记录
private int n = 0;//记录该路由有几个相邻的路由器
private String[] RouterNext = new String[2];
/// <summary>
/// 输入路由器的初始化信息,并返回初始化后的路由表
/// </summary>
/// <param name="RouterName"></param>
/// <returns></returns>
public String[,] initRouter(String RouterName)
{
Console.WriteLine("请输入" + RouterName +
"路由器的两个相邻网络名以'Nx'表示'x'为网络号");
Console.Write("第一个网络名:");
RIP[0, 0] = Console.ReadLine();
RIP[0, 1] = "0";
RIP[0, 2] = RouterName;
Console.Write("第二个网络名:");
RIP[1, 0] = Console.ReadLine();
RIP[1, 1] = "0";
RIP[1, 2] = RouterName;
return RIP;
}
/// <summary>
/// 输入相邻的路由名并返回下一跳路由名数组
/// </summary>
/// <param name="RouterName"></param>
/// <returns></returns>
public String[] NextRouter(String RouterName)
{
Console.Write("请输入" + RouterName +
"路由器有几个相邻的路由器(最多两个):");
n = int.Parse(Console.ReadLine());
if (n == 1)
{
Console.Write("请输入相邻路由器名(以'Rx'表示,x为数字):");
RouterNext[0] = Console.ReadLine();
}
else
{
Console.Write("请输入" + RouterName +
"的相邻路由器1名(以'Rx'表示,x为数字):");
RouterNext[0] = Console.ReadLine();
Console.Write("请输入" + RouterName +
"的相邻路由器2名(以'Rx'表示,x为数字):");
RouterNext[1] = Console.ReadLine();
}
return RouterNext;
}
/// <summary>
/// 返回相邻的路由器个数
/// </summary>
/// <returns></returns>
public int NumberOfNextRouter()
{
return n;
}
}
/// <summary>
/// 更新路由表
/// </summary>
public class UpDate
{
private String[,] Router1, Router2;
/// <summary>
/// 更新路由表
/// </summary>
/// <param name="RouterName1">需要被更新的路由器名</param>
/// <param name="RouterA">需要被更新的路由表</param>
/// <param name="String RouterName2">传入路由表的相邻路由器名</param>
/// <param name="RouterB">传入的相邻路由器的路由表</param>
/// <returns>更新后的路由表</returns>
public String[,] UpDateRIP(String RouterName1,String[,] RouterA,
String RouterName2,String[,] RouterB)
{
Router1 = RouterA;
Router2 = RouterB;
for (int i = 0; i < 5; i++)
{
if (Router2[i, 0] == null)
break;
for (int j = 0; j < 5; j++)
{
if (Router1[j, 0] == Router2[i, 0])
{
if (int.Parse(Router1[j, 1]) <
(int.Parse(Router2[i, 1]+1)))
{
if (Router1[j, 2] == Router2[i, 2])
{
if (Router2[i, 2] == RouterName1)
break;
else
{
Router1[j, 1] = (int.Parse(Router2[i, 1]) + 1)
.ToString();
break;
}
}
else
break;
}
if (int.Parse(Router1[j, 1]) ==
(int.Parse(Router2[i, 1]+1)))
{
break;
}
if (int.Parse(Router1[j, 1]) >
(int.Parse(Router2[i, 1])+1))
{
if (Router1[j, 2] == Router2[i, 2])
{
Router1[j, 1] = (int.Parse(Router2[i, 1]) + 1)
.ToString();
break;
}
if (Router1[j, 2] != Router2[i, 2])
{
Router1[j,1]=(int.Parse(Router2[i,1])+1)
.ToString();
Router1[j, 2] = RouterName2;
break;
}
}
break;
}
if (Router1[j, 0] != Router2[i, 0] && Router1[j, 0] != null)
continue;
if (Router1[j, 0] != Router2[i, 0]&&Router1[j, 0] == null)
{
Router1[j, 0] = Router2[i, 0];
Router1[j, 1] = (int.Parse(Router2[i, 1]) + 1).ToString();
Router1[j, 2] = RouterName2;
break;
}
}
}
return Router1;
}
}
public class swapInfo
{
/// <summary>
/// 路由表信息交换
/// </summary>
/// <param name="RouterName1">有两个相邻路由器的路由器名</param>
/// <param name="RIP1">有两个相邻路由器的路由表</param>
/// <param name="RouterName2">有一个相邻路由器的路由器名</param>
/// <param name="RIP2">有一个相邻路由器的路由表</param>
/// <param name="RouterName3">有一个相邻路由器的路由器名</param>
/// <param name="RIP3">有一个相邻路由器的路由表</param>
public void swap(String RouterNameA,ref String[,] RIP1,String RouterNameB,ref String[,] RIP2,
String RouterNameC,ref String[,] RIP3)
{
UpDate up = new UpDate();
RIP1 = up.UpDateRIP(RouterNameA, RIP1, RouterNameB, RIP2);
RIP1 = up.UpDateRIP(RouterNameA, RIP1, RouterNameC, RIP3);
RIP2 = up.UpDateRIP(RouterNameB, RIP2, RouterNameA, RIP1);
RIP3 = up.UpDateRIP(RouterNameC, RIP3, RouterNameA, RIP1);
}
}
}