25


15

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

これを行うための最良の方法は何ですか?

5 Answer


36


コマンドラインユーティリティipconfigが提供できる情報の種類を探しているなら、おそらくSystem.Net.NetworkInformation名前空間を使うべきです。

このサンプルコードは、すべてのネットワークインターフェイスを列挙し、各アダプタで認識されているアドレスをダンプします。

システムを使用する。 System.Netを使用する。 System.Net.NetworkInformationを使用します。

クラスProgram {static void Main(string [] args){foreach(NetworkInterfaceはNetworkInterface.GetAllNetworkInterfaces()でnetif){Console.WriteLine( "ネットワークインターフェイス:{0}"、netif.Name); IPInterfaceProperties properties = netif.GetIPProperties(); foreach(properties.DnsAddresses内のIPアドレスdns)Console.WriteLine( "\ tDNS:{0}"、dns); foreach(IPAddressInformationプロパティにanycast.AnycastAddresses)Console.WriteLine( "\ tAnyCast:{0}"、anycast.Address); foreach(プロパティ内のIPAddressInformationマルチキャスト。マルチキャストアドレス)Console.WriteLine( "\ tMultiCast:{0}"、multicast.Address); foreach(プロパティ内のIPAddressInformationユニキャスト。UnicastAddresses)Console.WriteLine( "\ tUniCast:{0}"、unicast.Address); }}}

あなたはおそらくUnicastAddressesに最も興味を持っています。


25


Dnsを使用するには、コンピュータがローカルDNSサーバーに登録されている必要があります。イントラネットに接続している場合は必ずしもそうではなく、ISPを使用している場合も同様です。 それはまたネットワークラウンドトリップを必要とします - すべてあなた自身のコンピュータについての情報を見つけるために。

正しい方法:

NetworkInterface [] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach(nicsのNetworkInterfaceアダプター){foreach(adapter.GetIPProperties()のUn x。UnicastAddresses){if(x.Address.AddressFamily == AddressFamily.InterNetwork :{0:x} "、x.Address.ToString());}}}

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

あるいはLinqの一行だけが好きな人のために:

NetworkInterface.GetAllNetworkInterfaces().SelectMany(adapter => adapter.GetIPProperties()。UnicastAddresses).Where(adr => adr.Address.AddressFamily == AddressFamily.InterNetwork)


24


http://www.devcity.net/Articles/62/1/gethostbyname.aspx[Link]それはそこに言っている、System.netを追加し、以下を使用して
//ローカルIPアドレス文字列を取得するにはsHostName = Dns.GetHostName(); IPHostEntry ipE = Dns.GetHostByName(sHostName); IPAddress [] IpA = ipE.AddressList; (int i = 0; i <IpA.Length; i){Console.WriteLine( "IPアドレス{0}:{1}"、i、IpA [i] .ToString()); }


11


マシンは複数のIPアドレスを持つことができるので、一般的なインターネットにルーティングするために使用しようとしているあなたのIPアドレスを把握する正しい方法は、インターネット上のホストへのソケットを開き、次にソケット接続を調べることです。その接続で使用されているローカルアドレスが何であるかを参照してください。

ソケット接続を調べることで、奇妙なルーティングテーブル、複数のIPアドレス、そして厄介なホスト名を考慮に入れることができます。 上記のホスト名を使ったトリックはうまくいきますが、完全に信頼できるとは思いません。


1


あなたのコンピュータに1つ以上のIPv4アドレスがあることを知っているなら、これはそれらのうちの1つを提供するでしょう:

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

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