在.NET应用程序中,如何识别用于与给定IP地址通信的网络接口?
我运行在具有多个网络接口、IPv4和v6的工作站上,并且我需要获取用于流量传输到我的数据库服务器的“正确”接口的地址。
在.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()函数获取接口索引,然后再循环遍历所有网络接口。与以前一样,您将需要查找GetIPProperties()
以访问IPv4InterfaceProperties.Index
属性)。
这两种方法都不能给OP提供他所需要的信息——他想知道哪个接口将用于到达特定目标。实现你想要的一种方法是使用System.Diagnostics.Process类调用shell命令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);
}
/// <summary>
/// Get ifIndex of ip (ip address to connect)
/// </summary>
/// <param name="ip">IP Address that want to connect</param>
/// <param name="description">Lan card description</param>
/// <param name="ifIndex">interface index</param>
/// <param name="ifAddress">IP Address of Lan Interface</param>
private static void CheckInterface(string ip, out string description, out int ifIndex, out IPAddress ifAddress)
{
description = "";
ifIndex = -1;
ifAddress = IPAddress.Any;
var myIp = IPAddress.Parse(ip);
if (!NetworkInterface.GetIsNetworkAvailable()) return;
foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces())
{
if (!adapter.SupportsMulticast) continue;
if (adapter.OperationalStatus != OperationalStatus.Up) continue;
var properties = adapter.GetIPProperties();
if (!properties.MulticastAddresses.Any()) continue;
var p = properties.GetIPv4Properties();
if (p == null) continue;
foreach (var ipInfo in properties.UnicastAddresses)
{
if (ipInfo.Address.AddressFamily == AddressFamily.InterNetwork)
{
//Console.WriteLine("Address:{0} == {1}", ipInfo.Address, myIp);
var adpIp = ipInfo.Address.GetAddressBytes();
var cmpIp = myIp.GetAddressBytes();
if ((adpIp[0] == cmpIp[0]) && (adpIp[1] == cmpIp[1]) && (adpIp[2] == cmpIp[2]))
{
description = adapter.Description;
ifIndex = p.Index;
ifAddress = ipInfo.Address;
return;
//Console.WriteLine("Name {0} ifIndex {1}", adapter.Description, p.Index);
}
}
}
}
}
今天对我来说没问题!(当 ifIndex 为-1 时,未找到接口)