プログラムでコンピューターのローカルネットワークIPアドレスを取得するにはどうすればよいですか?
-
02-07-2019 - |
質問
C#および.NET 3.5を使用して、プログラムからコンピューターの実際のローカルネットワークIPアドレス(例:192.168.0.220)を取得する必要があります。この場合、127.0.0.1を使用することはできません。
これを行う最良の方法は何ですか?
解決
リンク そこに、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 ());
}
他のヒント
コマンドラインユーティリティ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に最も関心があります。
DNSを使用するには、コンピューターをローカルDNSサーバーに登録する必要がありますが、イントラネットを使用している場合は必ずしもそうではありません。また、ネットワークの往復も必要です。すべては、自分のコンピューターに関する情報を見つけるためです。
適切な方法:
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の1行だけが好きな人向け:
NetworkInterface.GetAllNetworkInterfaces()
.SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
.Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible)
.Select (adr => adr.Address.ToString());
マシンは複数のIPアドレスを持つことができるため、一般的なインターネットへのルーティングに使用するIPアドレスを把握する正しい方法は、インターネット上のホストへのソケットを開いて、ソケット接続を使用して、その接続で使用されているローカルアドレスを確認します。
ソケット接続を検査することにより、奇妙なルーティングテーブル、複数のIPアドレス、おかしなホスト名を考慮することができます。上記のホスト名を使用したトリックは機能しますが、完全に信頼できるとは思わないでしょう。
コンピューターに1つ以上のIPv4アドレスがあることがわかっている場合は、次のいずれかが提供されます。
Dns.GetHostAddresses(Dns.GetHostName())
.First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()
GetHostAddresses
は通常、DNSサーバーへのクエリ中に呼び出しスレッドをブロックし、クエリが失敗した場合は SocketException
をスローします。自分のホスト名を検索するときにネットワーク呼び出しをスキップするかどうかはわかりません。