/// <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);
        }
Exemple #2
0
        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);