4

C#の場合:

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());

for (int i = 0; i < IPHost.AddressList.Length; i++)
{
    textBox1.AppendText("My IP address is: " 
        + IPHost.AddressList[i].ToString() + "\r\n");
}

このコードでは、IPHostEntry変数にコンピューターのすべてのIPアドレスが含まれています。さて、私が知る限り、Windows Vistaは、16進数、10進数など、いくつかのIPアドレスを返します。

問題は、必要な10進表記がIPHostEntry変数内の位置を変更することです。これは最初は最後の位置で発生していたため、次のコードでアクセスできます。

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 1].ToString();

ただし、コンピューターのIPアドレスを変更すると、最後から2番目の場所に表示されるため、次のコードを使用してアクセスする必要があります。

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 2].ToString();

IPHostEntry変数内の位置に関係なく、10進表記でIPアドレスを取得するコードはありますか?

4

3 に答える 3

10

IPv4アドレスのみが必要であると仮定すると、私は現在このコードを使用しています(投稿用に少し変更されています)。これは私の使用に十分な堅牢性を備えています。結果に対してToStringを呼び出すだけで、アドレスを取得できます。

// return the first IPv4, non-dynamic/link-local, non-loopback address
public static IPAddress GetIPAddress()
{
    IPAddress[] hostAddresses = Dns.GetHostAddresses("");

    foreach (IPAddress hostAddress in hostAddresses)
    {
        if (hostAddress.AddressFamily == AddressFamily.InterNetwork &&
            !IPAddress.IsLoopback(hostAddress) &&  // ignore loopback addresses
            !hostAddress.ToString().StartsWith("169.254."))  // ignore link-local addresses
            return hostAddress;
    }
    return null; // or IPAddress.None if you prefer
}

169.254。*の部分はハックのように見えるかもしれませんが、IETFRFC3927に文書化されています

于 2009-06-22T21:10:23.147 に答える
1

あなたが求めているのは、DNSクエリから返されたIPv4アドレスとIPv6アドレスを区別できるかどうかだと思います。答えはイエスです。IPAddressのAddressFamilyプロパティをチェックし、InterNetworkを返すことを確認します。

于 2009-06-22T20:36:00.237 に答える
1

16進アドレスはIPv6で、10進数の4つはipv4です。

于 2009-06-22T21:03:48.607 に答える