Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetIpNetTable, вывести тип  
V
    Опции темы
Barabeo
Дата 15.5.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Вот структура:

Код

 [StructLayout(LayoutKind.Sequential)]
        struct MIB_IPNETROW
        {
            [MarshalAs(UnmanagedType.U4)]
            public int dwIndex;
            [MarshalAs(UnmanagedType.U4)]
            public int dwPhysAddrLen;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac0;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac1;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac2;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac3;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac4;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac5;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac6;
            [MarshalAs(UnmanagedType.U1)]
            public byte mac7;
            [MarshalAs(UnmanagedType.U4)]
            public int dwAddr;
            [MarshalAs(UnmanagedType.U4)]
            public int dwType;



Вот ф-ция:
Код

            int bytesNeeded = 0;
            // The result from the API call. 
            int result = GetIpNetTable(IntPtr.Zero, ref bytesNeeded, false);
            // Call the function, expecting an insufficient buffer. 
            if (result != ERROR_INSUFFICIENT_BUFFER)
            {
                // Throw an exception. 
                throw new Win32Exception(result);
            }
            // Allocate the memory, do it in a try/finally block, to ensure 
            // that it is released. 
            IntPtr buffer = IntPtr.Zero;
            // Try/finally. 
            try
            {
                // Allocate the memory. 
                buffer = Marshal.AllocCoTaskMem(bytesNeeded);
                // Make the call again. If it did not succeed, then 
                // raise an error. 
                result = GetIpNetTable(buffer, ref bytesNeeded, false);
                // If the result is not 0 (no error), then throw an exception. 
                if (result != 0)
                {
                    // Throw an exception. 
                    throw new Win32Exception(result);
                }
                // Now we have the buffer, we have to marshal it. We can read 
                // the first 4 bytes to get the length of the buffer. 
                int entries = Marshal.ReadInt32(buffer);
                // Increment the memory pointer by the size of the int. 
                IntPtr currentBuffer = new IntPtr(buffer.ToInt64() +
                                                  Marshal.SizeOf(typeof (int)));
                // Allocate an array of entries. 
                MIB_IPNETROW[] table = new MIB_IPNETROW[entries];
                // Cycle through the entries. 
                for (int index = 0; index < entries; index++)
                {
                    // Call PtrToStructure, getting the structure information. 
                    table[index] = (MIB_IPNETROW) Marshal.PtrToStructure(new
                                                                             IntPtr(currentBuffer.ToInt64() + (index*
                                                                                                               Marshal.
                                                                                                                   SizeOf
                                                                                                                   (typeof
                                                                                                                        (                                                                                                        MIB_IPNETROW
                                                                                                                        )))),
                                                                         typeof (MIB_IPNETROW));
                }
                for (int index = 0; index < entries; index++)
                {
                    IPAddress ip = new IPAddress(table[index].dwAddr);
                    //listBox1.Items.Add("IP:" + ip.ToString() + "\t\tMAC:");

                    string mac = "";
                    mac = "IP:" + ip.ToString() + "\tMAC:";

                    byte b;
                    b = table[index].mac0;

                    if (b < 0x10)
                    {
                        mac += "0";
                        //listBox1.Items.Add("0");
                    }
                    else
                    {
                        mac += "";
                        //listBox1.Items.Add("");
                    }
                    listBox1.Items.Add(b.ToString("X"));
                    b = table[index].mac1;

                    if (b < 0x10)
                    {
                        mac += "-0";
                        //listBox1.Items.Add("-0");
                    }
                    else
                    {
                        mac += "-";
                        //listBox1.Items.Add("-");
                    }
                    mac += b.ToString("X");
                    //listBox1.Items.Add(b.ToString("X"));
                    b = table[index].mac2;
                    if (b < 0x10)
                    {
                        mac += "-0";
                        //listBox1.Items.Add("-0");
                    }
                    else
                    {
                        mac += "-";
                        //listBox1.Items.Add("-");
                    }
                    mac += b.ToString("X");
                    //listBox1.Items.Add(b.ToString("X"));
                    b = table[index].mac3;
                    if (b < 0x10)
                    {
                        mac += "-0";
                        //listBox1.Items.Add("-0");
                    }
                    else
                    {
                        mac += "-";
                        //listBox1.Items.Add("-");
                    }
                    mac += b.ToString("X");
                    //listBox1.Items.Add(b.ToString("X"));
                    b = table[index].mac4;
                    if (b < 0x10)
                    {
                        mac += "-0";
                        //listBox1.Items.Add("-0");
                    }
                    else
                    {
                        mac += "-";
                        //listBox1.Items.Add("-");
                    }
                    mac += b.ToString("X");
                    //listBox1.Items.Add(b.ToString("X"));
                    b = table[index].mac5;
                    if (b < 0x10)
                    {
                        mac += "-0";
                        //listBox1.Items.Add("-0");
                    }
                    else
                    {
                        mac += "-";
                        //listBox1.Items.Add("-");
                    }
                    mac += b.ToString("X");
                    //listBox1.Items.Add(b.ToString("X"));
                    listBox1.Items.Add(mac);
                }


Нужно чтобы она выводила тип адреса: динамический, статический.
Как это организовать?

Добавлено @ 16:08
Извиняюсь маленько промахнулся со вставкой кода.
Код

// удалено модератором


Модератор: Отредактировал топик по извенениям smile 
PM MAIL   Вверх
SSTREGG
Дата 21.5.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.5.2011

Репутация: нет
Всего: нет



Код

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication10
{
    class Program
    {
        const int ERROR_INSUFFICIENT_BUFFER = 0x7A;

        [DllImport("Iphlpapi.dll", SetLastError = true)]
        static extern int GetIpNetTable(
            [In, Out]     IntPtr pIpNetTable,
            [In, Out] ref int    pdwSize,
            [In]          bool   bOrder
            );

        [DllImport("Ws2_32.dll", SetLastError = true)]
        static extern string inet_ntoa(uint in_addr);

        enum MIB_IPNET_TYPE : uint {
            OTHER   = 1,
            INVALID = 2,
            DYNAMIC = 3,
            STATIC  = 4
        }

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct MIB_IPNETTABLE {
            public int dwNumEntries;
            public MIB_IPNETROW pFirstRow;
        }

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct MIB_IPNETROW {
            public uint dwIndex;
            public uint dwPhysAddrLen;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public byte[] bPhysAddr;
            public uint dwAddr;
            public MIB_IPNET_TYPE dwType;
        }

        static void Main ( string[] args ) {
            var pTable = IntPtr.Zero;
            int dwSize = 0;
            int retVal = 0;

            retVal = GetIpNetTable(pTable, ref dwSize, true);

            if (retVal == ERROR_INSUFFICIENT_BUFFER)
                pTable = Marshal.AllocHGlobal(dwSize);

            if (pTable == IntPtr.Zero) {
                Console.WriteLine("ERROR: " + Marshal.GetLastWin32Error());
                return;
            }

            if ((retVal = GetIpNetTable(pTable, ref dwSize, true)) != 0) {
                Marshal.FreeHGlobal(pTable);
                Console.WriteLine("ERROR: " + Marshal.GetLastWin32Error());
                return;
            }

            var table = (MIB_IPNETTABLE)Marshal.PtrToStructure(
                pTable,
                typeof(MIB_IPNETTABLE)
                );
            
            MIB_IPNETROW row;
            IntPtr pFirstRow = (IntPtr)(pTable.ToInt32() + 4 /* sizeof(MIB_IPNETTABLE.dwNumEntries) */ );
            int rowSize      = Marshal.SizeOf(typeof(MIB_IPNETROW));

            Console.WriteLine("Total: " + table.dwNumEntries);

            for (int i = 0; i < table.dwNumEntries; i++) {
                row = (MIB_IPNETROW)Marshal.PtrToStructure(
                    (IntPtr)(pFirstRow.ToInt32() + i * rowSize),
                    typeof(MIB_IPNETROW)
                    );

                Console.WriteLine(string.Format("{0}) {1}\t", i, row.dwType) +
                    inet_ntoa(row.dwAddr) +
                    string.Format(" - {0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}",
                        row.bPhysAddr[0], row.bPhysAddr[1], row.bPhysAddr[2],
                        row.bPhysAddr[3], row.bPhysAddr[4], row.bPhysAddr[5])
                    );
            }

            Marshal.FreeHGlobal(pTable);
        }
    }
}

PM   Вверх
Barabeo
Дата 3.6.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Благодарствуем  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.