Frage

Ich habe ein folgendes Problem. Ich habe einen Pinvoke in einem Windows CE .NET -Projekt für Getipforwardtable -Funktion erstellt. Wenn ich die Funktion in Rückkehr aufrufe, unterscheiden sich die Ergebnisse jedoch von dem von dem Routenbefehl zurückgegebenen Ergebnis. Es gibt mehr Einträge in der Tabelle, der Maske und des Ziels veränderten Stellen und Nexthop ist immer auf 0,0.0.0 gesetzt

Hier ist die Klasse (man muss ipforwardEntry.getIpforwardTable () anrufen).

public class IPForwardEntry
{
    public enum ForwardType
    {
        Other = 1,
        Invalid = 2,
        Direct = 3,
        Indirect = 4
    }

    public enum ForwardProtocol
    {
        Other = 1,
        Local = 2,
        NetMGMT = 3,
        ICMP = 4,
        EGP = 5,
        GGP = 6,
        Hello = 7,
        RIP = 8,
        IS_IS = 9,
        ES_IS = 10,
        CISCO = 11,
        BBN = 12,
        OSPF = 13,
        BGP = 14,
        NT_AUTOSTATIC = 10002,
        NT_STATIC = 10006,
        NT_STATIC_NON_DOD = 10007
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MIB_IPFORWARDROW
    {
        public uint dwForwardDest;
        public uint dwForwardMask;
        public int dwForwardPolicy;
        public uint dwForwardNextHop;
        public int dwForwardIfIndex;
        public ForwardType dwForwardType;
        public ForwardProtocol dwForwardProto;
        public int dwForwardAge;
        public int dwForwardNextHopAS;
        public int dwForwardMetric1;
        public int dwForwardMetric2;
        public int dwForwardMetric3;
        public int dwForwardMetric4;
        public int dwForwardMetric5;
    }

    private IPForwardEntry(MIB_IPFORWARDROW forwardRow)
    {
        myForwardRow = forwardRow;
    }

    private MIB_IPFORWARDROW myForwardRow;

    private const int NO_ERROR = 0;

    [DllImport("Iphlpapi.dll")]
    private static extern int CreateIpForwardEntry(MIB_IPFORWARDROW[] pRoute);

    [DllImport("Iphlpapi.dll")]
    private static extern int GetIpForwardTable(MIB_IPFORWARDROW[] pIpForwardTable, ref long pdwSize, bool bOrder);

    public static IPForwardEntry[] GetIpForwardTable()
    {
        long tableSize = 0;
        GetIpForwardTable(null, ref tableSize, true);

        MIB_IPFORWARDROW[] forwardTable = new MIB_IPFORWARDROW[tableSize / Marshal.SizeOf(typeof(MIB_IPFORWARDROW)) + 1];

        long tableSizeOld = tableSize;

        if (GetIpForwardTable(forwardTable, ref tableSize, false) != NO_ERROR)
            throw new SystemException();

        if (tableSizeOld != tableSize)
            throw new SystemException();


        IPForwardEntry[] result = new IPForwardEntry[forwardTable.Length];

        for (int i = 0; i < forwardTable.Length; i++)
            result[i] = new IPForwardEntry(forwardTable[i]);

        return result;

    }

    #region members

    public IPAddress FordwardDestination
    {
        get
        {
            return new IPAddress(myForwardRow.dwForwardDest);
        }
        set
        {
            myForwardRow.dwForwardDest = (uint) value.Address;
        }
    }

    public IPAddress ForwardMask
    {
        get
        {
            return new IPAddress(myForwardRow.dwForwardMask);
        }
        set
        {
            myForwardRow.dwForwardMask = (uint) value.Address;
        }
    }

    public int ForwardPolicy
    {
        get
        {
            return myForwardRow.dwForwardPolicy;
        }
        set
        {
            myForwardRow.dwForwardPolicy = value;
        }
    }

    public IPAddress ForwardNextHop
    {
        get
        {
            return new IPAddress(myForwardRow.dwForwardNextHop);
        }
        set
        {
            myForwardRow.dwForwardNextHop = (uint) value.Address;
        }
    }

    public int ForwardInterfaceIndex
    {
        get
        {
            return myForwardRow.dwForwardIfIndex;
        }
        set
        {
            myForwardRow.dwForwardIfIndex = value;
        }
    }


    public ForwardType ForwrdType
    {
        get
        {
            return myForwardRow.dwForwardType;
        }
        set
        {
            myForwardRow.dwForwardType = value;
        }
    }

    public ForwardProtocol Protocol
    {
        get
        {
            return myForwardRow.dwForwardProto;
        }
        set
        {
            myForwardRow.dwForwardProto = value;
        }
    }


    public int ForwardAge
    {
        get
        {
            return myForwardRow.dwForwardAge;
        }
        set
        {
            myForwardRow.dwForwardAge = value;
        }
    }

    public int ForwardNextHopAS
    {
        get
        {
            return myForwardRow.dwForwardNextHopAS;
        }
        set
        {
            myForwardRow.dwForwardNextHopAS = value;
        }
    }

    public int ForwardMetric1
    {
        get
        {
            return myForwardRow.dwForwardMetric1;
        }
        set
        {
            myForwardRow.dwForwardMetric1 = value;
        }
    }

    public int ForwardMetric2
    {
        get
        {
            return myForwardRow.dwForwardMetric2;
        }
        set
        {
            myForwardRow.dwForwardMetric2 = value;
        }
    }

    public int ForwardMetric3
    {
        get
        {
            return myForwardRow.dwForwardMetric3;
        }
        set
        {
            myForwardRow.dwForwardMetric3 = value;
        }
    }

    public int ForwardMetric4
    {
        get
        {
            return myForwardRow.dwForwardMetric4;
        }
        set
        {
            myForwardRow.dwForwardMetric4 = value;
        }
    }

    public int ForwardMetric5
    {
        get
        {
            return myForwardRow.dwForwardMetric5;
        }
        set
        {
            myForwardRow.dwForwardMetric5 = value;
        }
    }

    #endregion

}
War es hilfreich?

Lösung

GetipForwardtable gibt kein Array von MIB_IPForwardrow -Objekten zurück, sondern gibt ein MIB_IPFORWARDEDTABLE zurück, der eine Reihe von Zeilen enthält und die Nummer. Das ist also mindestens ein Problem. Es gibt wahrscheinlich andere, da dies kein unkomplizierter P/Invoke -Set für das Marshaling ist.

Für das, was es wert ist, habe ich bereits all diesen Code in der implementiert Smart Device Framework, speziell in der OpenNetcf.net.networkinformation.iproutingTable Klasse

Andere Tipps

Ich weiß nicht, wie die Funktion funktioniert, aber das folgende sieht sehr misstrauisch aus.

new MIB_IPFORWARDROW[tableSize / Marshal.SizeOf(typeof(MIB_IPFORWARDROW)) + 1]

Warum teilst du dich durch die? sizeof?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top