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();
}
}
解决方案 »
- C#如何连接西门子Wincc的OPC服务器
- div 弹出层与 postback
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 如何保证程序能在手机待机状态下继续工作?
- c# 关于Dispose的问题
- 怎样让dataGridView中新增的一行可编辑?
- 字符串的处理问题
- 高手呢?
- ×××××××(300分问题)自定义WEB控件,如何才能真正解决“在非窗体控件中保持客户端更改”问题?×××××××
- LogRecord,Clerk,Com+,Transaction的问题?大给分啊.少了再给~~我还有1400多分.全给~
- 在线求解决
- 读取图片的语句 由sqlserver修改为oracle 语句写法?
- C#多线程如何循环执行
静态路由和动态路由要看Route Print命令如何输出了!主要难点是网关选择