/// <summary> /// 创建路由 /// </summary> /// <param name="dest"></param> /// <param name="mask"></param> /// <param name="nextHop"></param> /// <param name="ifIndex"></param> /// <param name="metric"></param> /// <returns></returns> public static int CreateIpForwardEntry(IPAddress dest, IPAddress mask, IPAddress nextHop, uint ifIndex, int metric = 1) { IPForwardRow route = new IPForwardRow() { Dest = dest, Mask = mask, NextHop = nextHop, IfIndex = ifIndex, Metric = metric, Policy = 0, Type = MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT, Proto = MIB_IPPROTO.MIB_IPPROTO_NETMGMT, Age = 0, NextHopAS = 0 }; OperatingSystem os = Environment.OSVersion; if (os.Platform == PlatformID.Win32NT && os.Version.Major >= 6) { MIB_IPINTERFACE_ROW row; int res = GetIpInterfaceEntry(ifIndex, out row); if (res != 0) { return(res); } route.Metric = (int)row.Metric; } return(CreateIpForwardEntry(route)); }
/// <summary> /// 获取路由表 /// </summary> /// <param name="ipForwardTable"></param> /// <returns></returns> //public unsafe static int GetIpForwardTable(out IPForwardRow[] ipForwardTable) //{ // int res = 0, size = 0; // size = Marshal.SizeOf(typeof(MIB_IPFORWARDROW)); // MIB_IPFORWARDTABLE* table = (MIB_IPFORWARDTABLE*)Marshal.AllocHGlobal(size); // res = GetIpForwardTable(table, ref size, true); // if (res == 0x7A) // { // table = (MIB_IPFORWARDTABLE*)Marshal.ReAllocHGlobal((IntPtr)table, (IntPtr)size); // res = GetIpForwardTable(table, ref size, true); // } // if (res == 0) // { // ipForwardTable = new IPForwardRow[(*table).dwNumEntries]; // for (int i = 0; i < ipForwardTable.Length; i++) // { // ipForwardTable[i] = new IPForwardRow((&(*table).table)[i]); // } // } // else // ipForwardTable = null; // Marshal.FreeHGlobal((IntPtr)table); // return res; //} /// <summary> /// 获取基础路由 /// </summary> /// <param name="destAddr"></param> /// <param name="sourceAddr"></param> /// <param name="bestRoute"></param> /// <returns></returns> public static int GetBestRoute(IPAddress destAddr, IPAddress sourceAddr, out IPForwardRow bestRoute) { MIB_IPFORWARDROW pBestRoute; var res = GetBestRoute(IpToUint(destAddr), IpToUint(sourceAddr), out pBestRoute); bestRoute = new IPForwardRow(pBestRoute); return(res); }
/// <summary> /// 删除路由 /// </summary> /// <param name="route"></param> /// <returns></returns> public static int DeleteIpForwardEntry(IPForwardRow route) { return(DeleteIpForwardEntry(route.GetBaseStruct())); }