Ответ 1
добавьте что-то вроде этого в свой код
if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
// IPv4 address
Как получить только Протокол Интернета версии 4 от Dns.GetHostAddresses()
? У меня есть код ниже, и он дает мне IPv4 и IPv6-адреса.
Я должен заставить его работать с ящиками с несколькими адресами IPv4.
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
private void get_IPs()
{
foreach (IPAddress a in localIPs)
{
server_ip = server_ip + a.ToString() + "/";
}
}
добавьте что-то вроде этого в свой код
if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
// IPv4 address
Из мой блог:
/// <summary>
/// This utility function displays all the IP (v4, not v6) addresses of the local computer.
/// </summary>
public static void DisplayIPAddresses()
{
StringBuilder sb = new StringBuilder();
// Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface network in networkInterfaces)
{
// Read the IP configuration for each network
IPInterfaceProperties properties = network.GetIPProperties();
// Each network interface may have multiple IP addresses
foreach (IPAddressInformation address in properties.UnicastAddresses)
{
// We're only interested in IPv4 addresses for now
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
continue;
// Ignore loopback addresses (e.g., 127.0.0.1)
if (IPAddress.IsLoopback(address.Address))
continue;
sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")");
}
}
MessageBox.Show(sb.ToString());
}
В частности, я не рекомендую Dns.GetHostAddresses(Dns.GetHostName());
, независимо от того, насколько популярна эта строка в разных статьях и блогах.
Здесь используется функция:
public static string GetIP4Address()
{
string IP4Address = String.Empty;
foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (IPA.AddressFamily == AddressFamily.InterNetwork)
{
IP4Address = IPA.ToString();
break;
}
}
return IP4Address;
}
В качестве перечислимого:
public static IEnumerable<string> GetIP4Addresses()
{
return Dns.GetHostAddresses(Dns.GetHostName())
.Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
.Select(x => x.ToString());
}
Очень чистый и сладкий при использовании Linq
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
Из MSDN в Dns.GetHostAddresses,
Когда пустая строка передается как имя узла, этот метод возвращает адреса IPv4 локального хоста для всех операционных систем, кроме Windows Server 2003; для Windows Server 2003, как IPv4, так и IPv6 адреса для локального хоста.
Адреса IPv6 фильтруются из результатов GetHostAddresses если на локальном компьютере не установлен IPv6. Как результат, можно вернуть пустой экземпляр IPAddress, если только Результаты IPv6, доступные для параметра hostNameOrAddress.parameter.
Итак, вы можете использовать это для попробовать и проанализировать его:
IPAddress.TryParse
затем проверьте AddressFamily
, который
Возвращает System.Net.Sockets.AddressFamily.InterNetwork для IPv4 или System.Net.Sockets.AddressFamily.InterNetworkV6 для IPv6.
string input = "192.168.0.10";
IPAddress address;
if (IPAddress.TryParse(input, out address))
{
switch (address.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
// we have IPv4
break;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
// we have IPv6
break;
default:
// do something else
break;
}
}
Напишите locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
Я использовал ответ, который начинался с
/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
Мне пришлось использовать:
if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
но я действительно использовал:
if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))
Кроме того, я добавил:
if (network.OperationalStatus != OperationalStatus.Up)
continue;
Поскольку существовали сети, которые не работали и никогда не были там, я видел, что они были в реестре. --- Элвин
Для меня более чистым решением будет:
public static string GetLocalIP()
{
string ipv4Address = String.Empty;
foreach (IPAddress currentIPAddress in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (currentIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
ipv4Address = currentIPAddress.ToString();
break;
}
}
return ipv4Address;
}
Я использую этот вспомогательный метод, который возвращает первый активный IPv4-адрес после фильтрации IPV6 и Loopback один раз
public static IPAddress GetLocalIPAddress()
{
IPAddress result = null;
IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
IPAddress[] ipv4Address = Array.FindAll(iphostentry.AddressList, add => add.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(add));
if (ipv4Address.Length > 0 )
{
result =ipv4Address[0];
}
return result;
}
Это мой код. И можете найти его на многих картах LAN.
private string GetLocalIpAddress()
{
string localIpAddress = string.Empty;
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface nic in nics)
{
if (nic.OperationalStatus != OperationalStatus.Up)
{
continue;
}
IPv4InterfaceStatistics adapterStat = (nic).GetIPv4Statistics();
UnicastIPAddressInformationCollection uniCast = (nic).GetIPProperties().UnicastAddresses;
if (uniCast != null)
{
foreach (UnicastIPAddressInformation uni in uniCast)
{
if (adapterStat.UnicastPacketsReceived > 0
&& adapterStat.UnicastPacketsSent > 0
&& nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
{
if (uni.Address.AddressFamily == AddressFamily.InterNetwork)
{
localIpAddress = nic.GetIPProperties().UnicastAddresses[0].Address.ToString();
break;
}
}
}
}
}
return localIpAddress;
}