2012-04-26 12 views
31

Windows 8 WinRT/Metroアプリから実際のローカルIPアドレス(ループバックアドレスではない)を知る必要があります。私にはこれが必要な理由がいくつかあります。最も簡単なのは、アプリのUIで「あなたのローカルネットワークのIPアドレスは:[コードから照会されたIP]」のようなテキストを表示したいということです。ローカルIPアドレスの照会

また、追加のネットワーク通信用にアドレスを使用します。これらの通信は完全に有効です。なぜなら、私がコントロールパネルのIPアドレスを見て、それをアプリケーションにハードコードしていればすべて動作するからです。ダイアログでユーザーにアドレスを見て、手動で入力するように頼むことは、私が本当に避けたいものです。

プログラムでアドレスを取得するのは複雑な作業ではないと思いますが、検索エンジンとStackOverflowのスキルは空になります。

この時点で、私は自分自身の要求を聞き取り、そのアドレスを抽出するためにUDPブロードキャスト/リッスンループを行うことを検討し始めていますが、実際はハッキークルージュのようです。そこに私を連れてくる新しいWinRTのどこかにAPIがありますか?

私は「WinRTのアプリを述べた。Dns.GetHostEntryまたはNetworkInterface.GetAllInterfaces()のような典型的なメカニズムが仕事に行くされていないことに注意してください。

+0

誰かがローカルネットワークIPアドレスをネットワークデバイスに割り当てた場合、Windowsはそのインターフェイスのみを認識します(完全に有効です)。あなたは正確にIPアドレスを使って何をしようとしていますか? UDPブロードキャスト/リッスンを行うことはできませんが、インタフェースが知っているIPアドレスは、そのネットワークの外部では有効ではないローカルネットワークアドレスが最も頻繁に使用されます。 –

+0

http://msdn.microsoft.com/en-us/library/windows/apps/hh454046(v=vs.85).aspxを見てください。 –

+0

@Ramhound:私は何を見ているべきかわかりません。私がConsumer PreviewとVS11 Betaで見られる振る舞いとはまったく一致しません。例えば、ドキュメント 'NetworkIntrface.GetAllNetworkInterfaces()'は動作するはずですが、存在しません。 – ctacke

答えて

33

多くの掘削後、私はあなたがNetworkInformationHostNameを使用して必要な情報を見つけました。

NetworkInformation.GetInternetConnectionProfileは、現在ローカルマシンが使用するインターネット接続に関連付けられた接続プロファイルを取得します。

NetworkInformation.GetHostNamesは、ホスト名のリストを取得します。それは明白ではないのですが、これは、IPv4とIPv6のADDRESを含み文字列としてses。私たちはこのように、インターネットに接続されたネットワークアダプタのIPアドレスを取得することができ、この情報を使用して

public string CurrentIPAddress() 
{ 
    var icp = NetworkInformation.GetInternetConnectionProfile(); 

    if (icp != null && icp.NetworkAdapter != null) 
    { 
     var hostname = 
      NetworkInformation.GetHostNames() 
       .SingleOrDefault(
        hn => 
        hn.IPInformation != null && hn.IPInformation.NetworkAdapter != null 
        && hn.IPInformation.NetworkAdapter.NetworkAdapterId 
        == icp.NetworkAdapter.NetworkAdapterId); 

     if (hostname != null) 
     { 
      // the ip address 
      return hostname.CanonicalName; 
     } 
    } 

    return string.Empty; 
} 

HostNameは性質CanonicalName、表示名とRawNameを持っていますが、それらはすべて同じを返すように見えること文字列。我々はまた、このようなコードで複数のアダプタのアドレスを取得することができます

:受け入れ答えについて

private IEnumerable<string> GetCurrentIpAddresses() 
{ 
    var profiles = NetworkInformation.GetConnectionProfiles().ToList(); 

    // the Internet connection profile doesn't seem to be in the above list 
    profiles.Add(NetworkInformation.GetInternetConnectionProfile()); 

    IEnumerable<HostName> hostnames = 
     NetworkInformation.GetHostNames().Where(h => 
      h.IPInformation != null && 
      h.IPInformation.NetworkAdapter != null).ToList(); 

    return (from h in hostnames 
      from p in profiles 
      where h.IPInformation.NetworkAdapter.NetworkAdapterId == 
        p.NetworkAdapter.NetworkAdapterId 
      select string.Format("{0}, {1}", p.ProfileName, h.CanonicalName)).ToList(); 
} 
+4

うわー。 Windows 8をサポートしているように見えますが、お尻の痛みになるでしょう。 –

+0

@JimSchubert:または多分面白い挑戦。結局のところ、.NETではなく完全な書き換えです。 :) – Phil

+3

確かに挑戦です。私のチームはすぐにWindows 2003+(Windows 8を含む)をサポートする必要があります。痛みは、現在のマシンのIPアドレスを見つけるのと同じくらいシンプルなものであれば、まったく「掘り起こす」必要があるということです。 –

1

が、あなたはこの必要があります。

HostName localHostName = NetworkInformation.GetHostNames().FirstOrDefault(h => 
        h.IPInformation != null && 
        h.IPInformation.NetworkAdapter != null); 

をあなたはこのローカルIPアドレスを取得することができます方法:使用

string ipAddress = localHostName.RawName; //XXX.XXX.XXX.XXX 

名前空間:

using System.Linq; 
using Windows.Networking; 
using Windows.Networking.Connectivity; 
+0

この回答は完全に間違っています。特定のネットワーク構成では動作しますが、システムと仮想スイッチに仮想マシンを追加しようとすると、最初に返されるホスト名は完全に使用できない仮想スイッチIPになる可能性があります。 – Alex

関連する問題