Jak pobrać adresy IP komputera i jego interfejsy sieciowe w c#

6-Lut-2011

Tym razem należało wykonywać na komputerze pewne czynności w zależności od adresu MAC karty sieciowej lub adresu IP lub po prostu w zależności od rodzaju interfejsu sieciowego. Okazuje się, że .NET ma cały szereg funkcji pozwalających wykonywać tego rodzaju czynności. 

Należy rozpocząć od zaimportowania odpowiedniej przestrzeni nazw: 

using System.Net;
using System.Net.NetworkInformation;

Wśród znajdujących się tu funkcji na uwagę zasługuje: 

NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();

Metoda ta pozwala pobrać wszystkie interfejsy sieciowe do kolekcji.  W moim przypadku ciąg dalszy programu wyglądał tak: 

                foreach (NetworkInterface adapter in adapters)
                {

aby pobrać MAC Adres: 

                   string

mac = adapter.GetPhysicalAddress().ToString(); 

Pobranie nazwy komputera, która nie zmienia się w zależności od karty sieciowej należy użyć standardowej funkcji DNS: 

                   string name = Dns.GetHostName();

Pobranie adresu IP jest nieco trudniejsze. Pamiętajmy, że do pojedynczej karty sieciowej może być przecież przypisanych wiele protokołów, chociażby IPv4, iIPv6, IPX itp. Dostęp do konfiguracji interfejsu IP odbywa się poprzez pobranie właściwości adresu IP: 

                    IPInterfaceProperties properties = adapter.GetIPProperties();

I w tym przypadku zwracana jest kolekcja, którą można przejść krok po kroku: 

                    foreach (IPAddressInformation uniCast in properties.UnicastAddresses)
                    {

odwołanie do UnicastAddress powoduje, że przechodzimy przez wszystkie adresy pracujące w trybie Unicast. Jest to tryb odmienny niż Multicast, gdzie dla jednego pakietu istnieje wielu odbiorców. 

Na dodatek, adres ma ciekawe właściwości i metody: IsLoopback sprawdza czy adres jest Loopback-iem, Address.AddressFamily pozwala wyróżnić adres w wersji IPv4 i IPv6, zaś OperationalStatus pozwala stwierdzić czy interfejs jest włączony czy nie. Mnie zainteresowały adresy w wersji IPv4, włączone ale nie Loopback: 

                        bool takeIt =
                            !IPAddress.IsLoopback(uniCast.Address)
                            && uniCast.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                            && adapter.OperationalStatus == OperationalStatus.Up;
                        if (takeIt)
                        {

W takim przypadku unicast.Address.ToString() zwraca informacje o adresie IP. 

                            string ipv = uniCast.Address.ToString();
                            //ciąg dalszy ….
                        }
                    }
                }
 

W ten sposób udało się pobrać listę interfejsów sieciowych, nazwę komputera i nawet adres IP. A tak przy okazji, co się stało z IPv5?

Dodaj komentarz:

Autor: Rafał Kraik