/// <summary> /// 获取路由表 /// </summary> /// <param name="ipForwardTable"></param> /// <returns></returns> public unsafe static int GetIpForwardTable(out Route[] 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 Route[(*table).dwNumEntries]; for (int i = 0; i < ipForwardTable.Length; i++) { ipForwardTable[i] = new Route((&(*table).table)[i]); } } else { ipForwardTable = null; } Marshal.FreeHGlobal((IntPtr)table); return(res); }
private unsafe static List <MIB_IPFORWARDROW> GetRoutingTable() { var retVal = new List <MIB_IPFORWARDROW>(); var size = Marshal.SizeOf(typeof(MIB_IPFORWARDROW)); MIB_IPFORWARDTABLE *fwdTable = (MIB_IPFORWARDTABLE *)Marshal.AllocHGlobal(size); var result = GetIpForwardTable(fwdTable, ref size, true); if (result == 0x7A) { fwdTable = (MIB_IPFORWARDTABLE *)Marshal.ReAllocHGlobal((IntPtr)fwdTable, (IntPtr)size); result = GetIpForwardTable(fwdTable, ref size, true); } if (result == 0x00) { retVal = Enumerable.Range(0, fwdTable->dwNumEntries) .Select(i => new MIB_IPFORWARDROW { dwForwardDest = (&fwdTable->table)[i].dwForwardDest, dwForwardMask = (&fwdTable->table)[i].dwForwardMask, dwForwardPolicy = (&fwdTable->table)[i].dwForwardPolicy, dwForwardNextHop = (&fwdTable->table)[i].dwForwardNextHop, dwForwardIfIndex = (&fwdTable->table)[i].dwForwardIfIndex, dwForwardType = (&fwdTable->table)[i].dwForwardType, dwForwardProto = (&fwdTable->table)[i].dwForwardProto, dwForwardAge = (&fwdTable->table)[i].dwForwardAge, dwForwardNextHopAS = (&fwdTable->table)[i].dwForwardNextHopAS, dwForwardMetric1 = (&fwdTable->table)[i].dwForwardMetric1, dwForwardMetric2 = (&fwdTable->table)[i].dwForwardMetric2, dwForwardMetric3 = (&fwdTable->table)[i].dwForwardMetric3, dwForwardMetric4 = (&fwdTable->table)[i].dwForwardMetric4, dwForwardMetric5 = (&fwdTable->table)[i].dwForwardMetric5 }) .ToList(); } Marshal.FreeHGlobal((IntPtr)fwdTable); return(retVal); }
private unsafe static extern int GetIpForwardTable(MIB_IPFORWARDTABLE *pIpForwardTable, ref int pdwSize, bool bOrder);
public static extern uint GetIpForwardTable([NativeTypeName("PMIB_IPFORWARDTABLE")] MIB_IPFORWARDTABLE *pIpForwardTable, [NativeTypeName("PULONG")] uint *pdwSize, BOOL bOrder);