簡體   English   中英

獲取IP地址

[英]Getting the ip-address

在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返回一些十六進制的IP地址,一些是十進制表示法,依此類推。

問題是所需的十進制表示法改變了它在IPHostEntry變量中的位置:它最初出現在最后一個位置,因此可以使用以下代碼訪問:

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

但是,在更改計算機的IP地址后,它現在顯示在第二個最后位置,因此需要使用以下代碼進行訪問:

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

是否有任何代碼以十進制表示法檢索IP地址,而不IPHostEntryIPHostEntry變量中的位置?

假設你只想要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。*部分可能看起來像是一個黑客,但在IETF RFC 3927中有記錄

我相信您要問的是,您可以區分DNS查詢返回的IPv4和IPv6地址。 答案是肯定的。 檢查IPAddress上的AddressFamily屬性 ,並確保它返回InterNetwork

你的十六進制地址是IPv6,4個十進制數字是ipv4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM