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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetAllNetworkInterfaces выдает какой то мусор, NetworkInterface.GetAllNetworkInterfaces 
V
    Опции темы
MAG_S
Дата 28.6.2011, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я использую NetworkInterface.GetAllNetworkInterfaces() для получения своих сетевых интерфейсов,
потом я пытаюсь получить свои MAC адреса (NetInterf[i].GetPhysicalAddress())
и она выдает мне как мои интерфейсы так и какой то мусор:

[0]: ""
[1]: "00E018998887"
[2]: "001F3C0B4F8D"
[3]: ""
[4]: "00000000000000E0"
[5]: "00000000000000E0"
[6]: "00000000000000E0"
[7]: "00000000000000E0"

[1] и [2] мои реальные MAC адреса, но остальные не правильные, и вообще MAC адрес должен быть 6 байт!

В программе я фильтрую при помощи следующего кода
Код

if (NetInterf[i].GetPhysicalAddress().GetAddressBytes().Length == 6)

Но я не знаю правильно ли я делаю? Потому что в MSDN я по этому поводу я ничего не нашел!
PM MAIL ICQ   Вверх
Fortnox
Дата 29.6.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

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



Этот "мусор" - адреса IPV6.
Чтобы отфильтровать можно написать такой метод:
Код

        static IEnumerable<NetworkInterface> GetIpv4()
        {
            foreach (var i in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (i.NetworkInterfaceType == NetworkInterfaceType.Loopback)
                    continue;

                foreach (var addr in i.GetIPProperties().UnicastAddresses)
                {
                    if (addr.Address.AddressFamily == AddressFamily.InterNetwork)
                        yield return  i;
                }
            }
        }

Пример использования:
Код

            foreach (var inter in GetIpv4())
            {
                Console.WriteLine(inter.Name);
                Console.WriteLine(inter.GetPhysicalAddress());
            }


Это сообщение отредактировал(а) Fortnox - 29.6.2011, 00:02
PM MAIL   Вверх
MAG_S
Дата 29.6.2011, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



действительно...
большое спасибо)

только возник другой вопрос (из интереса),
NetworkInterface.GetAllNetworkInterfaces() выдает количество реальных интерфейсов,
у меня только одна "дырка)" + wifi, 
а как отличить те интерфейсы которые реально существуют (включая тех у кого только IPv6) от фиктивных?
PM MAIL ICQ   Вверх
Fortnox
Дата 29.6.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

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



Мм. Думаю придется использовать тогда реестр. Например так:
Код

        public class NetworkCard
        {
            public string Description { get; set; }
            public string ServiceName { get; set; }
        }

        static IList<NetworkCard> GetAllNetworkCards()
        {
            const string interfacesKey = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\";
            RegistryKey rootKey = Registry.LocalMachine;
            var nc = new List<NetworkCard>();
            RegistryKey interfaces = rootKey.OpenSubKey(interfacesKey);

            foreach (var kName in interfaces.GetSubKeyNames())
            {
                var ik = rootKey.OpenSubKey(interfacesKey + @"\" + kName);
                var networkCard = new NetworkCard();
                //networkCard.ServiceName = ik.GetValue("ServiceName").ToString();
                networkCard.Description = ik.GetValue("Description").ToString();
                nc.Add(networkCard);
            }
            return nc;
        }

Пример:
Код

        static void Main(string[] args)
        {
            foreach (var nc in GetAllNetworkCards())
            {
                Console.WriteLine("{0}={1}", nc.ServiceName, nc.Description);
            }
            Console.ReadLine();
        }

Выхлоп:
Код

{EEF37790-BAB2-4D9F-A689-542DDCDE0E21}=Marvell Yukon 88E8001/8003/8010 PCI Gigabit Ethernet Controller


Еще как вариант, можно, наверное, использовать WMI.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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