RIP路由表调整算法的实现

来源:互联网 发布:iphone4s越狱清除数据 编辑:程序博客网 时间:2024/05/22 17:51

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);
        }
    }
}

原创粉丝点击