private void button12_Click(object sender, EventArgs e)
        {
           
            //输出路由表
            Process RoouteTable = new Process();
           
            ProcessStartInfo newRoute = new ProcessStartInfo("route", "print");
            newRoute.RedirectStandardOutput = true;
            newRoute.WindowStyle = ProcessWindowStyle.Hidden;
            newRoute.UseShellExecute = false;
            RoouteTable.StartInfo = newRoute;            RoouteTable.Start();            String Str = RoouteTable.StandardOutput.ReadToEnd();
            Regex RouteTableReg = new Regex(@"(?s)(?i)[ ]+(?<DescIp>(?<d1>[0-9]{1,3}).(?<d2>[0-9]{1,3}).(?<d3>[0-9]{1,3}).(?<d4>[0-9]{1,3}))[ ]+(?<MaskIp>(?<m1>[0-9]{1,3}).(?<m2>[0-9]{1,3}).(?<m3>[0-9]{1,3}).(?<m4>[0-9]{1,3}))[ ]+[\S\s]{15}[ ]+(?<Ip>(?<i1>[0-9]{1,3}).(?<i2>[0-9]{1,3}).(?<i3>[0-9]{1,3}).(?<i4>[0-9]{1,3}))[ ]+(?<Met>[0-9]+)");
            MatchCollection ms = RouteTableReg.Matches(Str);
            if (ms.Count > 0)
            {
                for (int i = 0; i < ms.Count; i++)
                {
                    RouteTables.Add(new RouteTableInfo(new IpInfo(ms[i].Groups["d1"].Value.ToString(), ms[i].Groups["d2"].Value.ToString(), ms[i].Groups["d3"].Value.ToString(), ms[i].Groups["d4"].Value.ToString()),
                        new IpInfo(ms[i].Groups["m1"].Value.ToString(), ms[i].Groups["m2"].Value.ToString(), ms[i].Groups["m3"].Value.ToString(), ms[i].Groups["m4"].Value.ToString()),
                        new IpInfo(ms[i].Groups["i1"].Value.ToString(), ms[i].Groups["i2"].Value.ToString(), ms[i].Groups["i3"].Value.ToString(), ms[i].Groups["i4"].Value.ToString()),
                        int.Parse(ms[i].Groups["Met"].Value.ToString())));                                        
                }
            }            if (RouteTables.Routes.Count > 0)
            {
                IpInfo Matchs = RouteTables.MatchRoute(new IpInfo("192", "168", "0", "37"));
            }                     
        }
    }    public class RouteTable
    {
        /// <summary>
        /// 路由记录
        /// </summary>
        public List<RouteTableInfo> Routes = new List<RouteTableInfo>();
        /// <summary>
        /// 增加路由记录
        /// </summary>
        /// <param name="_Info"></param>
        public void Add(RouteTableInfo _Info)
        {
            if (_Info.isTrue)
            {
                Routes.Add(_Info);
                if (_Info.isDefault)
                {
                    DefaultRoutes = _Info;
                }
            }
        }
        /// <summary>
        /// 本路由表的默认路由
        /// </summary>
        public RouteTableInfo DefaultRoutes { get; set; }
        /// <summary>
        /// 给指定的IP匹配路由出口
        /// </summary>
        /// <param name="_MatchIp"></param>
        /// <returns></returns>
        public IpInfo MatchRoute(IpInfo _MatchIp)
        {
            if (_MatchIp.is_true == true)
            {
                RouteTableInfo FindRoutes = null;
                int Max = 0;
                foreach (RouteTableInfo _Route in Routes)
                {
                    if (_MatchIp.Ti.StartsWith(_Route.NetWorkID))
                    {
                        if (_Route.NetWorkID.Length > Max)
                        {
                            FindRoutes = _Route;
                            Max = FindRoutes.NetWorkID.Length;
                        }
                    }
                }
                if (FindRoutes == null)
                {
                    return DefaultRoutes.Ip;
                }
                else
                {
                    return FindRoutes.Ip;
                }
            }
            else
            {
                return null;
            }
        }    }    /// <summary>
    /// 路由信息
    /// </summary>
    public class RouteTableInfo
    {
        /// <summary>
        /// 目标网络号
        /// </summary>
        public IpInfo  DescIp { get; set; }
        /// <summary>
        /// 子网掩码
        /// </summary>
        public IpInfo MaskIp { get; set; }
        /// <summary>
        /// 接口IP
        /// </summary>
        public IpInfo Ip { get; set; }
        /// <summary>
        /// 跳
        /// </summary>
        public int Met { get; set; }
        /// <summary>
        /// 是否成功
        /// </summary>
        public Boolean isTrue{get;set;}
        /// <summary>
        /// 2进制的网关
        /// </summary>
        public String NetWorkID { get; set; }
        /// <summary>
        /// 是否默认网关
        /// </summary>
        public Boolean isDefault { get; set; }
        public RouteTableInfo(String _Str)
        {        }
        public RouteTableInfo(IpInfo _DescIp, IpInfo _MaskIp, IpInfo _Ip, int _Met)
        {
            try
            {
                if (_DescIp.is_true && _MaskIp.is_true && _Ip.is_true && _Met > 0)
                {
                    DescIp = _DescIp;
                    MaskIp = _MaskIp;
                    Ip = _Ip;
                    Met = _Met;
                    isTrue = true;
                    if (DescIp.ToString() == "0.0.0.0")
                    {
                        isDefault = true;
                    }
                    GetNetWorkId();
                }
                else
                {
                    isTrue = false;
                }      
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                isTrue = false;
            }
        }
        /// <summary>
        /// 用目标网络和子网掩码获得网络号
        /// </summary>
        private void GetNetWorkId()
        {
            StringBuilder Sb = new StringBuilder();
            for (int i = 0; i < DescIp.Ti .Length; i++)
            {
                if (MaskIp.Ti[i] == '1')
                {
                    Sb.Append(DescIp.Ti[i]);
                }
                else
                {
                    break;
                }
            }
            NetWorkID = Sb.ToString();            
        }    }
    public class IpInfo
    {
        /// <summary>
        /// 第一节点
        /// </summary>
        public int I1 { get; set; }
        /// <summary>
        /// 第一节点的二进制形式
        /// </summary>
        public String Ti1 { get; set; }
        /// <summary>
        /// 第二节点
        /// </summary>
        public int I2 { get; set; }
        /// <summary>
        /// 第二节点的二进制形式
        /// </summary>
        public String Ti2 { get; set; }
        /// <summary>
        /// 第三节点
        /// </summary>
        public int I3 { get; set; }
        /// <summary>
        /// 第三节点的二进制形式
        /// </summary>
        public String Ti3 { get; set; }
        /// <summary>
        /// 第四节点
        /// </summary>
        public int I4 { get; set; }
        /// <summary>
        /// 第四节点的二进制形式
        /// </summary>
        public String Ti4 { get; set; }
        /// <summary>
        /// 完整的节点的二进制形式
        /// </summary>
        public String Ti { get; set; }
        /// <summary>
        /// 是否正常
        /// </summary>
        public Boolean is_true { get; set; }        public IpInfo(String  _I1, String _I2, String _I3, String _I4)
        {
            try
            {                
                I1 = int.Parse(_I1);
                I2 = int.Parse(_I2);
                I3 = int.Parse(_I3);
                I4 = int.Parse(_I4);
                if (!((I1 <= 255 && I1 >= 0) && (I2 <= 255 && I2 >= 0) && (I3 <= 255 && I3 >= 0) && (I4 <= 255 && I4 >= 0)))
                {
                    throw new Exception("值超出范围");
                }
                is_true = true;
                GetTwo();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                is_true = false;
            }
        }
        /// <summary>
        /// 获得二进制格式
        /// </summary>
        private void GetTwo()
        {
            Ti1 = Convert.ToString(I1, 2);
            Ti1 = SetZero(Ti1);
            Ti2 = Convert.ToString(I2, 2);
            Ti2 = SetZero(Ti2);
            Ti3 = Convert.ToString(I3, 2);
            Ti3 = SetZero(Ti3);
            Ti4 = Convert.ToString(I4, 2);
            Ti4 = SetZero(Ti4);
            Ti = Ti1 + Ti2 + Ti3 + Ti4;
        }        private String SetZero(String _Str)
        {
            if (_Str.Length < 8)
            {
                int Len = _Str.Length;
                for (int i = 0; i < 8 - Len ; i++)
                {
                    _Str = "0" + _Str;
                }
            }
            return _Str ;
        }        /// <summary>
        /// 输出当前的IP的文本形式
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return I1.ToString() + "." + I2.ToString() + "." + I3.ToString() + "." + I4.ToString(); 
        }
    }