30

インターネットプロトコルバージョン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() + "/";
        }
    }
4

11 に答える 11

36

私のブログから:

/// <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());

于 2011-07-12T18:05:58.460 に答える
28

このようなものをコードに追加します

  if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
  // IPv4 address
于 2011-07-12T18:01:23.190 に答える
12

これが私が使用する関数です:

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());
}
于 2011-07-12T18:01:42.197 に答える
7

Linqを使用すると非常にきれいで甘い

IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
于 2013-12-05T02:16:34.347 に答える
4

Dns.GetHostAddressesのMSDNから、

空の文字列がホスト名として渡されると、このメソッドはWindowsServer2003を除くすべてのオペレーティングシステムのローカルホストのIPv4アドレスを返します。Windows Server 2003の場合、ローカルホストのIPv4アドレスとIPv6アドレスの両方が返されます。

ローカルコンピューターにIPv6がインストールされていない場合、IPv6アドレスはGetHostAddressesメソッドの結果からフィルター処理されます。その結果、hostNameOrAddress.parameterでIPv6のみが使用可能である場合、空のIPAddressインスタンスを取り戻すことができます。

したがって、これを使用して解析を試みることができます。

IPAddress.TryParse

次に、どれを確認AddressFamilyします

IPv4の場合はSystem.Net.Sockets.AddressFamily.InterNetworkを返し、IPv6の場合はSystem.Net.Sockets.AddressFamily.InterNetworkV6を返します。

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;
    }
}
于 2011-07-12T18:05:45.277 に答える
4

書くlocaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)

于 2011-07-12T18:00:54.127 に答える
1

で始まる答えを使用しました

/// <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;

機能せず、そこにあるはずのないネットワークがいくつかあったため、それらがレジストリにあることがわかりました。 - -アルヴィン

于 2014-05-06T03:09:14.833 に答える
0

IPV6 とループバックを 1 回フィルターで除外した後、最初のアクティブな IPV4 アドレスを返すこのヘルパー メソッドを使用します。


    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;
    }
于 2014-02-11T23:15:57.107 に答える
0

私にとって、よりクリーンなソリューションは次のようになります。

 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;
        }
于 2012-08-30T11:04:57.990 に答える