26

C# と .NET 3.5 を使用して、プログラムからコンピュータの実際のローカル ネットワーク IP アドレス (192.168.0.220 など) を取得する必要があります。この場合、127.0.0.1 だけを使用することはできません。

どうすればこれを達成できますか?

4

5 に答える 5

38

コマンド ライン ユーティリティ ipconfig が提供できる種類の情報を探している場合は、おそらく System.Net.NetworkInformation 名前空間を使用する必要があります。

このサンプル コードは、すべてのネットワーク インターフェイスを列挙し、各アダプターの既知のアドレスをダンプします。

using System;
using System.Net;
using System.Net.NetworkInformation;

class Program
{
    static void Main(string[] args)
    {
        foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() )
        {
            Console.WriteLine("Network Interface: {0}", netif.Name);
            IPInterfaceProperties properties = netif.GetIPProperties();
            foreach ( IPAddress dns in properties.DnsAddresses )
                Console.WriteLine("\tDNS: {0}", dns);
            foreach ( IPAddressInformation anycast in properties.AnycastAddresses )
                Console.WriteLine("\tAnyCast: {0}", anycast.Address);
            foreach ( IPAddressInformation multicast in properties.MulticastAddresses )
                Console.WriteLine("\tMultiCast: {0}", multicast.Address);
            foreach ( IPAddressInformation unicast in properties.UnicastAddresses )
                Console.WriteLine("\tUniCast: {0}", unicast.Address);
        }
    }
}

おそらく、UnicastAddresses に最も関心があるでしょう。

于 2008-09-30T00:33:24.280 に答える
27

Dns を使用するには、コンピューターをローカル DNS サーバーに登録する必要があります。これは、イントラネットを使用している場合は必ずしも当てはまらず、自宅で ISP を利用している場合はさらに可能性が低くなります。また、ネットワーク ラウンドトリップも必要です。すべては、自分のコンピュータに関する情報を見つけるためです。

適切な方法:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface  adapter in  nics)
{
    foreach(var x in adapter.GetIPProperties().UnicastAddresses)
    {
        if (x.Address.AddressFamily == AddressFamily.InterNetwork  && x.IsDnsEligible)
        {
                    Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString());
        }
    }
}

(2015 年 7 月 31 日更新: コードのいくつかの問題を修正)

または、Linq の行だけが好きな人のために:

NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork  && adr.IsDnsEligible)
    .Select (adr => adr.Address.ToString());
于 2008-09-30T00:49:38.143 に答える
24

John Spano によるホスト名を使用して .NET で IP アドレスを取得する方法では、System.Net名前空間を追加し、次のコードを使用するように指示されています。

//To get the local IP address 
string sHostName = Dns.GetHostName (); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); 
}
于 2008-09-29T23:53:52.707 に答える
11

マシンは複数の IP アドレスを持つことができるため、一般的なインターネットへのルーティングに使用する IP アドレスを把握する正しい方法は、インターネット上のホストへのソケットを開き、ソケット接続を検査することです。その接続で使用されているローカル アドレスを確認します。

ソケット接続を検査することで、奇妙なルーティング テーブル、複数の IP アドレス、奇抜なホスト名を考慮することができます。上記のホスト名を使用したトリックは機能しますが、完全に信頼できるとは思いません。

于 2008-09-30T00:02:30.533 に答える
1

コンピューターに 1 つ以上の IPv4 アドレスがあることがわかっている場合は、そのうちの 1 つが提供されます。

Dns.GetHostAddresses(Dns.GetHostName())
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()

GetHostAddresses通常、DNS サーバーにクエリを実行している間は呼び出しスレッドをブロックしSocketException、クエリが失敗した場合は をスローします。自分のホスト名を検索するときにネットワーク呼び出しをスキップするかどうかはわかりません。

于 2013-10-17T16:46:54.800 に答える