.net 识别活动网络接口

kokeuurv  于 2023-08-08  发布在  .NET
关注(0)|答案(6)|浏览(120)

在.NET应用程序中,如何识别使用哪个网络接口与给定的IP地址进行通信?
我在具有多个网络接口(IPv4和v6)的工作站上运行,我需要获得用于到给定数据库服务器的流量的“正确”接口的地址。

83qze16e

83qze16e1#

最简单的方法是:

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属性)。

ercv8c1e

ercv8c1e2#

这两个接口都不会给OP提供他想要的信息--他想知道哪个接口将被用来到达给定的目的地。一种方法是使用System.Diagnostics.Process类执行route命令,然后对输出进行屏幕抓取。route PRINT (destination IP)会给你一些有用的东西。这可能不是最好的解决方案,但这是我现在唯一能给予你的。

ccgok5k5

ccgok5k53#

您所需的信息将在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类以了解每个适配器的“静态”信息(最大速度、制造商等)

mdfafbf1

mdfafbf14#

至少你可以从这开始,给你所有的地址从dns的本地机器。

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

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

字符串

4szc88ey

4szc88ey5#

只是为了给予一个完整的画面:另一种方法是使用Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... )
ConferenceXP包含了相当全面的功能,可以使用IPv4/6和多播地址:https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84

gg58donl

gg58donl6#

这是一个古老的线程,但今天我正在寻找这个,但找到一个更好的答案,我想。

/// <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时,未找到接口)

相关问题