ローカルIPアドレスを取得する


301

インターネットには、IPアドレスを取得する方法を示す場所がいくつかあります。そしてそれらの多くはこの例のように見えます:

String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
    Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();

この例では、いくつかのIPアドレスを取得していますが、プログラムを実行しているコンピューターにルーターが割り当てるIPアドレスを取得することにのみ興味があります。インスタンス。

ネットワークに接続しておらず、ルーターのないモデムを介して直接インターネットに接続している場合、エラーが発生します。コンピューターがC#を使用してネットワークに接続されているかどうか、およびLAN IPアドレスを取得するために接続されているかどうかを確認するにはどうすればよいですか。


If I am not connected to a network and I am connected to the internet この発言は矛盾しているようです。コンピュータがプライベートLANまたはインターネットに接続されているかどうかを確認しようとしていますか?
アンディ

4
警告のように:コンピューターは、LANやWiFiなど、複数のIPインターフェースを持つことができます。サービスを特定のハードウェア(LANなど)にバインドする場合は、LANのIPが必要です。次の例のほとんどは、見つかった「最初」または「最後」のIPアドレスを返します。3つ以上のIPアドレスがある場合、OSがIPアドレスを返すランダムな順序によっては、プログラムが50%の時間動作する可能性があります。
Mark Lakata 2014年

@MarkLakata私は同じ問題について考えました。以下の私の答えの関数がそれを処理します。IPアドレスを取得するネットワークインターフェイスのタイプを指定できます。
compman2408 2014年

3
Unity 3Dでここでグーグルする場合、FTRだけです。APIのNetwork.player.ipAddressです
Fattie

@MarkLakata厳密に言えば、ブラウザは使用可能な任意のIPを使用できるため、「最初の」または「最後の」IP 「正しい」IPです。おそらく、適切な修正は、マシンに関連付けられているすべての IP を返すことです。
UncaAlby 2017

回答:


457

ローカルIPアドレスを取得するには:

public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("No network adapters with an IPv4 address in the system!");
}

接続されているかどうかを確認するには:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();


29
vm仮想ボックス、genymotionなどを使用する場合は機能しません
PauLEffect

5
PaulEffectに同意します。この方法は、複数のネットワークカードに適しているだけでなく、IP v6アドレスとIP v4アドレスを区別しません。
最大の

16
@John AddressFamily.InterNetworkはIP v4で、AddressFamily.InterNetworkV6はIP v6です
Leonardo Xavier

私はGeraldo H Answerを使用していますが、誰かがこれを使用している場合は、1で終わるすべてのIPを削除することをお勧めします。これにより、ループバックとvirtualbox / vmwareのデフォルトのIPが削除されます
Leonardo Xavier

6
VMWareまたは他の仮想化ソフトウェアを使用しているようです。OPはそれを要求しなかったので、それによる投票の拒否は少し厳しいと思います。VMWareまたは複数のNICを使用している場合、他の回答のいくつかはすでにその手がかりを提供しています。
Mrchief、2016年

218

ローカルマシンで使用可能なマルチIPアドレスがある場合、より正確な方法があります。ConnectUDPソケットとそのローカルエンドポイントを読み取る:

string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
    socket.Connect("8.8.8.8", 65530);
    IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
    localIP = endPoint.Address.ToString();
}

ConnectUDPソケット上で次のような効果を持っている:それは先を設定しますSend/ Recv-私たちが使用しているものである- 、他のアドレスからのすべてのパケットを破棄し、「接続」状態、設定の適切なフィールドに転送ソケット。これには、システムのルーティングテーブルに従って宛先へのルートの存在を確認し、それに応じてローカルエンドポイントを設定することが含まれます。最後の部分は公式には文書化されていないようですが、バージョンとディストリビューション全体でWindows とLinuxの両方で確実に機能するバークレーソケットAPI(UDPの「接続」状態の副作用)の不可欠な特性のように見えます

したがって、このメソッドは、指定されたリモートホストへの接続に使用されるローカルアドレスを提供します。実際の接続が確立されていないため、指定されたリモートIPに到達できない可能性があります。


4
これは私のニーズに合った最良のソリューションです。私の状況では、多くのネットワークカードといくつかのワイヤレス接続があります。アクティブ化された接続に応じて、優先IPアドレスを取得する必要がありました。
デビッド

10
ネットワーク接続がなければ、とにかくIPアドレスがありません。したがって、このような状況を処理するためにtry..catchを追加し、SocketExceptionがスローされた場合に "127.0.0.1"のようなものを返すことは賢明ですが、コードは引き続き有効です。
Russ

2
@PatrickSteele、そう、特定のターゲットの優先送信IPアドレスを返します。LAN IPアドレスを取得したい場合は、ターゲットをLANからの一部のIPに指定してください
Mr.WangのNext Doorから

2
この方法はdotnetコアを搭載したMacで機能しますが、現在受け入れられている回答は機能しません。
ペレット

9
このソリューションは、受け入れられた回答(Mrchief)の約4倍の速さで機能します。これが本当の答えになるはずです
カマレイ

115

Linqを活用するためのMrcheifのコードのリファクタリング(つまり、.Net 3.0+)。。

private IPAddress LocalIPAddress()
{
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    {
        return null;
    }

    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());

    return host
        .AddressList
        .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
}

:)


「インターネットワーク」としていくつかのIPアドレスを持っています。このソリューションは実際に機能し、正しいものを返します。Mrchiefからのもう1つは私に最後のものをちょうど与えます。したがって、実際にはこれが正しいものである必要があります;)
Keenora Fluffball

26
@KeenoraFluffball-これは最初のものを提供しますが、これは最後のものを提供します(またはその逆は、リストの構成方法によって異なります)。どちらの方法でも、どちらも正しくありません。複数のIPアドレスが指定されている場合は、使用しているネットワークを知る必要があります。最初または最後をとることによる推測は正しい解決策ではありません。
gbjbaanb 2013

AddressFamily.InterNetworkV6も含めたい場合があります
joelsand

スタンドアロンPCも処理する必要がある場合は、ネットワークが利用できない場合にnullを返すことは役に立ちません。「return IPAddress.Loopback;」に置き換えました。これは、特別なIP番号127.0.0.1に対応しています。
クリスチャン

109

私はこれが死んだ馬を蹴っているかもしれないことを知っていますが、おそらくこれは誰かを助けることができます。私は自分のローカルIPアドレスを見つける方法をあちこち探してきましたが、どこにでもあると書いてあります:

Dns.GetHostEntry(Dns.GetHostName());

コンピュータに割り当てられたすべてのアドレスを取得するだけなので、これはまったく好きではありません。複数のネットワークインターフェイスがある場合(ほとんどすべてのコンピューターで現在使用されています)、どのネットワークインターフェイスにどのアドレスが対応しているかがわかりません。一連の調査を行った後、NetworkInterfaceクラスを使用して情報をヤンクする関数を作成しました。このようにして、インターフェースのタイプ(イーサネット、ワイヤレス、ループバック、トンネルなど)、アクティブかどうか、そしてはるかにわかります。

public string GetLocalIPv4(NetworkInterfaceType _type)
{
    string output = "";
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
        {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
            {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    output = ip.Address.ToString();
                }
            }
        }
    }
    return output;
}

次に、イーサネットネットワークインターフェイスコールのIPv4アドレスを取得します。

GetLocalIPv4(NetworkInterfaceType.Ethernet);

または、ワイヤレスインターフェイス:

GetLocalIPv4(NetworkInterfaceType.Wireless80211);

ワイヤレスインターフェイスのIPv4アドレスを取得しようとしたが、コンピューターにワイヤレスカードがインストールされていない場合、空の文字列が返されます。イーサネットインターフェイスについても同様です。

これが誰かを助けることを願っています!:-)

編集:

この機能はIPアドレスの抽出よりもはるかに優れた方法でIPアドレスを抽出するもののDns.GetHostEntry(Dns.GetHostName())、同じタイプの複数のインターフェースまたは単一のインターフェースで複数のIPアドレスをサポートすることはあまりうまくいかないことが指摘されました(@NasBanovに感謝)。複数のアドレスが割り当てられている可能性がある場合は、単一のIPアドレスのみを返します。これらの割り当てられたアドレスをすべて返すには、元の関数を操作して、常に単一の文字列ではなく配列を返すようにします。例えば:

public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
    List<string> ipAddrList = new List<string>();
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
        {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
            {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    ipAddrList.Add(ip.Address.ToString());
                }
            }
        }
    }
    return ipAddrList.ToArray();
}

この関数は、特定のインターフェイスタイプに割り当てられたすべてのアドレスを返します。単一の文字列のみを取得するには、.FirstOrDefault()拡張機能を使用して配列の最初の項目を返すか、それが空の場合は空の文字列を返すことができます。

GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();

5
多くの場所でDNSの使いやすさがなく、インターフェースが複数のIPアドレスを持つことができるため、これはより良いソリューションです。私も同様の方法を利用しています。
MertGülsoy2014年

これの問題は、インターフェースごとに1つのIPアドレスしか返されないことです... foreachの最後のIP
Nas Banov 2016年

@ compman2408-真ではありません。単一のインターフェースが複数のIPを持つことができます。すべてのコンボについては、en.wikipedia.org / wiki / Multihoming#Variantsを参照してください。明らかな例は、IPv4とIPv6の両方を実行している場合ですが、以前は単一のイーサネットアダプターを複数のIPv4ネットワークに参加させていました。珍しいかもしれませんが、完全に合法です。たとえばWindowsの場合は、windowsnetworking.com / articles
2003 /…を

@NasBanovこの関数はIPv4アドレスを取得するためだけに設定されているため、IPv6とその現在の役に立たないことについては説明しません。マルチホーミングが複数のインターフェース上の複数のネットワークに接続していることは承知していますが、同じインターフェース上の複数のネットワークに接続することは聞いたことがありません。実際にそれが可能であることが正しいと思われる場合でも、NICをそのように使用する人の1%未満が、代わりに配列を返すように関数を変更する必要があります。
compman2408 2016年

1
これありがとう。参考までに、少なくともOSXの.NET 3.5 monoではitem.OperationalStatus常にが返されますUnknown
gman

36

ここに私のために働いた(compman2408のものからの)修正バージョンがあります:

    internal static string GetLocalIPv4(NetworkInterfaceType _type)
    {  // Checks your IP adress from the local network connected to a gateway. This to avoid issues with double network cards
        string output = "";  // default output
        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) // Iterate over each network interface
        {  // Find the network interface which has been provided in the arguments, break the loop if found
            if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
            {   // Fetch the properties of this adapter
                IPInterfaceProperties adapterProperties = item.GetIPProperties();
                // Check if the gateway adress exist, if not its most likley a virtual network or smth
                if (adapterProperties.GatewayAddresses.FirstOrDefault() != null)
                {   // Iterate over each available unicast adresses
                    foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses)
                    {   // If the IP is a local IPv4 adress
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {   // we got a match!
                            output = ip.Address.ToString();
                            break;  // break the loop!!
                        }
                    }
                }
            }
            // Check if we got a result if so break this method
            if (output != "") { break; }
        }
        // Return results
        return output;
    }

このメソッドは、たとえば次のように呼び出すことができます。

GetLocalIPv4(NetworkInterfaceType.Ethernet);

変更:ゲートウェイIPが割り当てられているアダプターからIPを取得しています。2番目の変更:このメソッドをより効率的にするために、docstringsとbreakステートメントを追加しました。


2
賢いソリューション。私は今これを使っています。
RQDQ 2015

4
派生元のコードと同じ問題があります。IPの1つ、つまり多数のランダムなIPを返すだけです。これは、必要なIPである必要はありません。それは稼いでいるademiller.com/blogs/tech/2008/06/it-works-on-my-machine-award
ナズBanov

1
@NasBanov、私が私の記事で述べているように、確かに私はそれを獲得しました:「それは私のために働いた」。:-)
ヘラルドH

これは進むべき道です、ありがとうございます。エミュレータ用のループバックスイッチがインストールされている場合、他のすべてのバリアントは失敗しますが、これは成功します!
DiamondDrake 2016

1
なぜ最初のIPアドレスではなく、最後のIPアドレスだけを返すのですか?break最も内側のシンペルifまたはreturnトリックを行います。
マーティンマルダー2017年

20

これは、VMWareホストやその他の無効なIPアドレスの取得を回避して、現在のIPを取得するために見つけた最良のコードです。

public string GetLocalIpAddress()
{
    UnicastIPAddressInformation mostSuitableIp = null;

    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var network in networkInterfaces)
    {
        if (network.OperationalStatus != OperationalStatus.Up)
            continue;

        var properties = network.GetIPProperties();

        if (properties.GatewayAddresses.Count == 0)
            continue;

        foreach (var address in properties.UnicastAddresses)
        {
            if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                continue;

            if (IPAddress.IsLoopback(address.Address))
                continue;

            if (!address.IsDnsEligible)
            {
                if (mostSuitableIp == null)
                    mostSuitableIp = address;
                continue;
            }

            // The best IP is the IP got from DHCP server
            if (address.PrefixOrigin != PrefixOrigin.Dhcp)
            {
                if (mostSuitableIp == null || !mostSuitableIp.IsDnsEligible)
                    mostSuitableIp = address;
                continue;
            }

            return address.Address.ToString();
        }
    }

    return mostSuitableIp != null 
        ? mostSuitableIp.Address.ToString()
        : "";
}

おそらく、このコードが答えの解決策である理由を説明する必要があります。あなたがインターネットに接続している場合、実際に質問の答えを得ることができますか?これはエラーになりますか?
Philipp M

他の方法では、IsDnsEligibleおよびPrefixOrigin検証を使用しません。
rodcesar.santos 16

@PhilippMアドレスがDNS適格ではない場合、予約済みの内部IPです。インターネットプロバイダーのホストではありません。そして、PrefixOriginがDHCPサーバーから提供された場合、これが最良のアドレス選択になる可能性があります。これは私にとってユニークな機能です!
rodcesar.santos 16

1
@ user1551843-ありがとうございました。私は古い廃止されたGetHostByNameメソッドを使用していましたが、それはVMWareアダプターのIPを返していました:)
Jason Newland 2017年

これは、vpn +ワイヤレスで動作する唯一のソリューションでした。ありがとうございました。
jay-danger

12

LinQを使用する方が簡単だと思います。

Dns.GetHostEntry(Dns.GetHostName())
   .AddressList
   .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
   .ToString()

14
それはLINQではなく、それは拡張メソッドとラムダです。違いがあります。
マーク

10
@Mark-「using System.Linq;」を追加しない場合 ただし、「最初の」拡張メソッドは使用できません
BornToCode

5
これは、拡張メソッドがSystem.Linq名前空間にあるEnumerableクラスにあるためです。それはまだLINQではありません。
マーク

20
マーク、この短い形式でも、ステートメントは実際にmethod(lambda)構文で提示されたLINQ-to-objectsを使用しています。クエリ構文は、IEnumerable拡張メソッド呼び出しのチェーンにコンパイルされる単純な構文シュガーであり、これがLINQ-to-objectsです。出典:LINQ-to-SQLプロバイダーと、このテーマに関する一連の記事を作成。
コンスタンティンg


9

笑ってみると、新しいC#6のnull条件演算子を使用して、1つのLINQステートメントを取得してみようと思いました。かなりクレイジーに見え、恐ろしく非効率的ですが、動作します。

private string GetLocalIPv4(NetworkInterfaceType type = NetworkInterfaceType.Ethernet)
{
    // Bastardized from: http://stackoverflow.com/a/28621250/2685650.

    return NetworkInterface
        .GetAllNetworkInterfaces()
        .FirstOrDefault(ni =>
            ni.NetworkInterfaceType == type
            && ni.OperationalStatus == OperationalStatus.Up
            && ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null
            && ni.GetIPProperties().UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) != null
        )
        ?.GetIPProperties()
        .UnicastAddresses
        .FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork)
        ?.Address
        ?.ToString()
        ?? string.Empty;
}

ロジックの礼儀Gerardo H(および参照によりcompman2408)。


間違いなく楽しい(+1)ですが、実際にはまったく非効率である必要はありません。LISPまたはForthでのプログラミングを思い出します:-)
Roland

6

linq式を使用してIPを取得する他の方法:

public static List<string> GetAllLocalIPv4(NetworkInterfaceType type)
{
    return NetworkInterface.GetAllNetworkInterfaces()
                   .Where(x => x.NetworkInterfaceType == type && x.OperationalStatus == OperationalStatus.Up)
                   .SelectMany(x => x.GetIPProperties().UnicastAddresses)
                   .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork)
                   .Select(x => x.Address.ToString())
                   .ToList();
}

5

@mrcheif今日この回答を見つけました。コードが機能していないためではなく、間違ったIPを返しましたが、Himachiなどを実行しているときに間違ったインターネットワークIPを返しましたが、非常に役に立ちました。

public static string localIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());

    foreach (IPAddress ip in host.AddressList)
    {
        localIP = ip.ToString();

        string[] temp = localIP.Split('.');

        if (ip.AddressFamily == AddressFamily.InterNetwork && temp[0] == "192")
        {
            break;
        }
        else
        {
            localIP = null;
        }
    }

    return localIP;
}

2
Logmein Hamachiですか?これはVPNソリューションであり、ネットワークスタックを調整します。また、VPNであるため、接続時にVPNが割り当てたIPを返すことは理にかなっているようです(私の推測です)。
Mrchief 2013年

2
完全に信頼できない。192.0.0.0/8プライベートIPアドレスのテストが正しくないだけでなく(3つの範囲があり、すべてこの範囲とは異なります)、企業ネットワークの範囲である可能性が高いため、それほど "ローカル"ではありません。
ivan_pozdeev 2017年

5

1つまたは複数のLANカードと仮想マシンでテスト済み

public static string DisplayIPAddresses()
    {
        string returnAddress = String.Empty;

        // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface network in networkInterfaces)
        {
            // Read the IP configuration for each network
            IPInterfaceProperties properties = network.GetIPProperties();

            if (network.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
                   network.OperationalStatus == OperationalStatus.Up &&
                   !network.Description.ToLower().Contains("virtual") &&
                   !network.Description.ToLower().Contains("pseudo"))
            {
                // Each network interface may have multiple IP addresses
                foreach (IPAddressInformation address in properties.UnicastAddresses)
                {
                    // We're only interested in IPv4 addresses for now
                    if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                        continue;

                    // Ignore loopback addresses (e.g., 127.0.0.1)
                    if (IPAddress.IsLoopback(address.Address))
                        continue;

                    returnAddress = address.Address.ToString();
                    Console.WriteLine(address.Address.ToString() + " (" + network.Name + " - " + network.Description + ")");
                }
            }
        }

       return returnAddress;
    }

これはイーサネットでのみ機能することに注意してください。wi-fiをサポートするためにNetworkInterfaceType制限を削除します。
scor4er

3

LINQを使用した私の更新バージョン:

/// <summary>
/// Gets the local Ipv4.
/// </summary>
/// <returns>The local Ipv4.</returns>
/// <param name="networkInterfaceType">Network interface type.</param>
IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType)
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up);

    foreach (var networkInterface in networkInterfaces)
    {
        var adapterProperties = networkInterface.GetIPProperties();

        if (adapterProperties.GatewayAddresses.FirstOrDefault() == null)
                continue;
        foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily != AddressFamily.InterNetwork)
                    continue;

            return ip.Address;
        }
    }

    return null;
}

2

前提条件:System.Data.Linq参照を追加して参照する必要があります

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));

2

また、正しいIPを取得するのにも苦労していました。

ここでさまざまな解決策を試しましたが、望ましい効果を提供するものはありませんでした。提供されたほとんどすべての条件テストでは、アドレスが使用されませんでした。

これは私のために働いたものです、それが役に立てば幸い...

var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address)
                    where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                    select address).FirstOrDefault();

Console.WriteLine(firstAddress);

1
string str="";

System.Net.Dns.GetHostName();

IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(str);

IPAddress[] addr = ipEntry.AddressList;

string IP="Your Ip Address Is :->"+ addr[addr.Length - 1].ToString();

strは常に空
aj.toulan

1

一般的なケースでは、複数のNAT変換が行われ、複数のDNSサーバーがそれぞれ異なるNAT変換レベルで動作している可能性があることに注意してください。

キャリアグレードのNATがあり、同じキャリアの他の顧客と通信したい場合はどうなりますか?NAT変換のたびに異なるホスト名で表示される可能性があるため、一般的なケースでは、確信が持てません。


1

時代遅れになり、これは私にはうまくいきます

public static IPAddress GetIPAddress()
{ 
 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => 
 address.AddressFamily == AddressFamily.InterNetwork).First();
 return ip;
}

1

LinchiでMrchiefの回答を更新すると、次のようになります。

public static IPAddress GetLocalIPAddress()
{
   var host = Dns.GetHostEntry(Dns.GetHostName());
   var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
   return ipAddress;
}

1

これは、IPV4とIPV6の2つの別々のリストにゲートウェイアドレスとユニキャストアドレスを持つすべてのインターフェースからアドレスを返します。

public static (List<IPAddress> V4, List<IPAddress> V6) GetLocal()
{
    List<IPAddress> foundV4 = new List<IPAddress>();
    List<IPAddress> foundV6 = new List<IPAddress>();

    NetworkInterface.GetAllNetworkInterfaces().ToList().ForEach(ni =>
    {
        if (ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null)
        {
            ni.GetIPProperties().UnicastAddresses.ToList().ForEach(ua =>
            {
                if (ua.Address.AddressFamily == AddressFamily.InterNetwork) foundV4.Add(ua.Address);
                if (ua.Address.AddressFamily == AddressFamily.InterNetworkV6) foundV6.Add(ua.Address);
            });
        }
    });

    return (foundV4.Distinct().ToList(), foundV6.Distinct().ToList());
}

きちんとした解決策:)
JohanFranzén19年

1

すでに多くの答えがありますが、私はまだ私のものを貢献しています:

public static IPAddress LocalIpAddress() {
    Func<IPAddress, bool> localIpPredicate = ip =>
        ip.AddressFamily == AddressFamily.InterNetwork &&
        ip.ToString().StartsWith("192.168"); //check only for 16-bit block
    return Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(localIpPredicate);
}

一発ギャグ:

public static IPAddress LocalIpAddress() => Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork && ip.ToString().StartsWith("192.168"));

注:MobileHotspot、VPN、その他の豪華な仮想アダプターなど、一部のインターフェイスがデバイスに追加された後でも機能するため、最後から検索します。


1
ローカルIPが10.0.2.3の場合、見つからないのですか?これはこのコードでは本当に奇妙です。
フランクホンマー

@frankhommers は、16ビットブロックのチェックのみ
ナイコニング

16ビットのブロックは192.168以外のものでも
かまい

0

さらに、クライアントIPを取得するための単純なコード:

        public static string getclientIP()
        {
            var HostIP = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
            return HostIP;
        }

お役に立てば幸いです。


0
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].MapToIPv4() //returns 192.168.14.1

ここに画像の説明を入力してください


5
回答には、OPの場合と将来の読者のために、それがどのように機能するかの説明を含める必要があります。
Ronak Dhoot

今後の読者のために、回答の説明を含めることをお勧めします。
Nicolas Gervais

0

compman2408のコードを変更して、それぞれを反復できるようにしましたNetworkInterfaceType

public static string GetLocalIPv4 (NetworkInterfaceType _type) {
    string output = null;
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces ()) {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties ().UnicastAddresses) {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork) {
                    output = ip.Address.ToString ();
                }
            }
        }
    }
    return output;
}

そして、あなたはそれを次のように呼び出すことができます:

static void Main (string[] args) {
    // Get all possible enum values:
    var nitVals = Enum.GetValues (typeof (NetworkInterfaceType)).Cast<NetworkInterfaceType> ();

    foreach (var nitVal in nitVals) {
        Console.WriteLine ($"{nitVal} => {GetLocalIPv4 (nitVal) ?? "NULL"}");
    }
}

0
Imports System.Net
Imports System.Net.Sockets
Function LocalIP()
    Dim strHostName = Dns.GetHostName
    Dim Host = Dns.GetHostEntry(strHostName)
    For Each ip In Host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            txtIP.Text = ip.ToString
        End If
    Next

    Return True
End Function

同じアクションの下

関数LocalIP()

Dim Host As String = Dns.GetHostEntry(Dns.GetHostName).AddressList(1).MapToIPv4.ToString

txtIP.Text =ホスト

Trueを返す

終了機能


以下の例は、同じアクションですFunction LocalIP()Dim Host As String = Dns.GetHostEntry(Dns.GetHostName).AddressList(1).MapToIPv4.ToString txtIP.Text = Host Return True End Function
YongJae Kim

-2
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]

1行のコード:D


7
場合によっては、OutOfRangeExceptionがスローされることがあります。
Loudenvier 2014年

5
また、どの方法が必要かをどのようにして知るのですか?あなたにとって正しいことは他の誰かにとって間違っているかもしれません。
マーク

-3

仮想マシンまたは追加のネットワークカードを使用している場合は、アドレスリストに他の値がある可能性があります。私の提案は、アドレスリストのエントリを確認し、適切なものを印刷することです。私の場合、エントリ3は私のマシンのipv4アドレスでした

IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[3];
string ip = ipAddr.ToString();

追加することを忘れないでください using System.Net;


1
補正; これらはすべて、マシンのIPアドレスです。ただし、どちらを使用するかはまったく別の話です。順序は変わる可能性があり、使用している方法により、常に推測することに注意してください。
マーク・

それが私が言ったことです、あなたは
アドレスリスト

どれが適切かをどのようにして知っていますか?compman2048のソリューションを使用すると、少なくともどちらがどのインターフェースに関連付けられているかがわかります。
マーク

2つのwlanインターフェイス、2つの仮想マシン、1つのエミュレーターがあるため、私のコンピューターではそのソリューションは機能しませんでした。そのため、多くのIPを取得しました。しかし、ルーターが提供する内部アドレスを探している場合、192または172または10で始まります。それが私が理解した方法です
Bibaswann Bandyopadhyay

ルーターがパブリックIPを提供しない限り、これは一般的ではありませんが可能です。
マーク・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.