Wiem, że to może kopać martwego konia, ale może to komuś pomóc. Wszędzie szukałem sposobu na znalezienie mojego lokalnego adresu IP, ale wszędzie tam jest napisane, aby użyć:
Dns.GetHostEntry(Dns.GetHostName());
W ogóle mi się to nie podoba, ponieważ po prostu dostaje wszystkie adresy przypisane do twojego komputera. Jeśli masz wiele interfejsów sieciowych (które robią obecnie prawie wszystkie komputery), nie masz pojęcia, który adres pasuje do którego interfejsu sieciowego. Po przeprowadzeniu wielu badań stworzyłem funkcję, aby użyć klasy NetworkInterface i wyciągnąć z niej informacje. W ten sposób mogę powiedzieć, jaki to jest interfejs (Ethernet, bezprzewodowy, pętla zwrotna, tunel itp.), Czy jest aktywny czy nie, i SOOO znacznie więcej.
public string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}
Teraz, aby uzyskać adres IPv4 połączenia z interfejsem sieci Ethernet:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
Lub twój interfejs bezprzewodowy:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Jeśli spróbujesz uzyskać adres IPv4 dla interfejsu bezprzewodowego, ale twój komputer nie ma zainstalowanej karty bezprzewodowej, zwróci tylko pusty ciąg. To samo z interfejsem Ethernet.
Mam nadzieję, że to komuś pomoże! :-)
EDYTOWAĆ:
Zwrócono uwagę (dzięki @NasBanov), że chociaż ta funkcja zajmuje się wyodrębnianiem adresu IP w znacznie lepszy sposób niż używanie Dns.GetHostEntry(Dns.GetHostName())
go, nie radzi sobie dobrze z obsługą wielu interfejsów tego samego typu lub wielu adresów IP na jednym interfejsie . Zwróci tylko jeden adres IP, gdy może być przypisanych wiele adresów. Aby zwrócić WSZYSTKIE przypisane adresy, wystarczy manipulować oryginalną funkcją, aby zawsze zwracała tablicę zamiast pojedynczego łańcucha. Na przykład:
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
Teraz ta funkcja zwróci WSZYSTKIE przypisane adresy dla określonego typu interfejsu. Teraz, aby uzyskać tylko jeden ciąg, możesz użyć .FirstOrDefault()
rozszerzenia, aby zwrócić pierwszy element w tablicy lub, jeśli jest pusty, zwrócić pusty ciąg.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
To stwierdzenie wydaje się sprzeczne. Czy próbujesz dowiedzieć się, czy komputer jest podłączony do prywatnej sieci LAN czy Internetu?