web-dev-qa-db-ja.com

アクティブなネットワークインターフェイスの識別

.NETアプリケーションで、特定のIPアドレスとの通信に使用されているネットワークインターフェイスを特定するにはどうすればよいですか?

IPv4とv6の複数のネットワークインターフェイスを備えたワークステーションで実行しています。特定のデータベースサーバーへのトラフィックに使用される「正しい」インターフェイスのアドレスを取得する必要があります。

25
Tiberiu Ana

最も簡単な方法は次のとおりです。

_UdpClient u = new UdpClient(remoteAddress, 1);
IPAddress localAddr = ((IPEndPoint)u.Client.LocalEndPoint).Address;
_

ここで、NetworkInterfaceオブジェクトが必要な場合は、次のようにします。

_
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
   IPInterfaceProperties ipProps = nic.GetIPProperties();
   // check if localAddr is in ipProps.UnicastAddresses
}
_


別のオプションは、P/Invokeを使用し、 GetBestInterface() を呼び出してインターフェイスインデックスを取得してから、すべてのネットワークインターフェイスを再度ループすることです。前と同じように、_IPv4InterfaceProperties.Index_プロパティにアクセスするには、GetIPProperties()を掘り下げる必要があります。

34
Yariv

これらのどちらも、実際にはOPに探している情報を提供しません。彼は、特定の宛先に到達するためにどのインターフェイスが使用されるかを知りたいと考えています。必要なことを行う1つの方法は、System.Diagnostics.Processクラスを使用してrouteコマンドにシェルアウトし、出力をスクリーンスクレイピングすることです。 route PRINT (destination IP)はあなたに何か使えるものを手に入れます。それはおそらく最良の解決策ではありませんが、私が今あなたに与えることができるのはそれだけです。

5
Coderer

あなたが求めている情報はWMIにあります。

WMIを使用したこの例では、ほとんどの場合、次のことが可能です。

using System.Management;
string query = "SELECT * FROM Win32_NetworkAdapterConfiguration";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();// Every record in this collection is a network interface
foreach (ManagementObject mo in moCollection)
{    
    // Do what you need to here....
}

Win32_NetworkAdapterConfiguration クラスは、アダプタの構成に関する情報を提供します。 IPアドレスなど.

Win32_NetworkAdapter クラスをクエリして、各アダプタ(最大速度、製造元など)に関する「静的」を見つけることもできます。

3
Paul Nearney

全体像を示すために、別のアプローチはSocket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... )を使用することです。

ConferenceXPには、これをラップするかなり包括的な関数が含まれており、IPv4/6およびマルチキャストアドレスで機能します。 https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs #L84

2
lxa

少なくとも、それから始めることができ、ローカルマシンのDNSからのすべてのアドレスを提供します。

IPHostEntry hostEntry = Dns.GetHostEntry(Environment.MachineName);

foreach (System.Net.IPAddress address in hostEntry.AddressList)
{
    Console.WriteLine(address);
}
1