.NETアプリケーションで、特定のIPアドレスとの通信に使用されているネットワークインターフェイスを特定するにはどうすればよいですか?
IPv4とv6の複数のネットワークインターフェイスを備えたワークステーションで実行しています。特定のデータベースサーバーへのトラフィックに使用される「正しい」インターフェイスのアドレスを取得する必要があります。
最も簡単な方法は次のとおりです。
_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()
を掘り下げる必要があります。
これらのどちらも、実際にはOPに探している情報を提供しません。彼は、特定の宛先に到達するためにどのインターフェイスが使用されるかを知りたいと考えています。必要なことを行う1つの方法は、System.Diagnostics.Processクラスを使用してrouteコマンドにシェルアウトし、出力をスクリーンスクレイピングすることです。 route PRINT (destination IP)
はあなたに何か使えるものを手に入れます。それはおそらく最良の解決策ではありませんが、私が今あなたに与えることができるのはそれだけです。
あなたが求めている情報は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 クラスをクエリして、各アダプタ(最大速度、製造元など)に関する「静的」を見つけることもできます。
全体像を示すために、別のアプローチはSocket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... )
を使用することです。
ConferenceXPには、これをラップするかなり包括的な関数が含まれており、IPv4/6およびマルチキャストアドレスで機能します。 https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs #L84
少なくとも、それから始めることができ、ローカルマシンのDNSからのすべてのアドレスを提供します。
IPHostEntry hostEntry = Dns.GetHostEntry(Environment.MachineName);
foreach (System.Net.IPAddress address in hostEntry.AddressList)
{
Console.WriteLine(address);
}