4

そのマシンで実行されているコードからマシンのローカル イントラネット IP を取得しようとしています。これを行う決定的な方法はありますか?

すべての IP を取得して、10.0.0.0-10.255.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255 でフィルタリングしようとしました。

Dns.GetHostEntry(Dns.GetHostName()).AddressList

しかし、これは私には少し魔法のようです.netが仕事をしたほうがいいです.VirtualBoxがインストールされているため、複数のIPも返します

私も次のことを試しました

var localAddress =
    (
        from ni in NetworkInterface.GetAllNetworkInterfaces()
        where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback
                && hostEntry.HostName.EndsWith(string.Concat(".", ni.Name))
        let props = ni.GetIPProperties()
        from unicastAddress in props.UnicastAddresses
        where unicastAddress.Address.AddressFamily == AddressFamily.InterNetwork
        select unicastAddress.Address).FirstOrDefault();

どちらが機能しますが、他のネットワーク構成でも機能しますか?

このビットは私に関係しますhostEntry.HostName.EndsWith(string.Concat(".", ni.Name))

誰かがより良い方法を手に入れましたか?

4

1 に答える 1

3

マシンが複数のネットワーク カードまたはネットワーク カードごとに複数の IP を持つ可能性があるため、単一の IP を確実に使用することはできません。たとえば、私のラップトップには有線ネットワーク カードと無線ネットワーク カードの両方があり、ルーターから DHCP 経由で 2 つのローカル IP を取得できて非常に満足しています。

また、いくつかの派手なネットワーク設定 (主に企業環境) では、ルーターを介してそれぞれと通信できる異なるサブネットを持つ IP を持つことができます。オフィス タワーのフロア 6 を 192.168.6.X、フロア番号 7 を 192.168.7.X にして、サブネット マスクによってマスクされているにもかかわらず、ルーターで複数のサブネット間のトラフィックを許可する場合があります。

より良い戦略は、ローカル IP のリストを取得し、ループバック アドレス (127.0.0.1) をフィルター処理してから、ターゲット マシンへの接続を試みることです。

しかし、ローカル IP を「インターネット上で公開されていない」ものとして検出したいだけの場合は、1 ホップの存続時間 (TTL) で公開アドレス (おそらく Web サーバー?) に ping を試みることができます。これは、ルーターが存在する場合、ルーターを通過することはありません。つまり、ファイアウォールの背後にあることを示す 1 ホップ以下でパブリック インターネットに到達できない場合、失敗します。

ソースコードを含むstackoverflowに関するこの素晴らしい回答を確認してください: IPがLAN内にあるかどうかを確認してください(ファイアウォールとルーターの背後)

于 2012-08-20T21:29:26.227 に答える