Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 识别特定的网络适配器_C#_.net_Networking_Network Programming_Ip - Fatal编程技术网

C# 识别特定的网络适配器

C# 识别特定的网络适配器,c#,.net,networking,network-programming,ip,C#,.net,Networking,Network Programming,Ip,我的应用程序在有多个网络适配器(2-4个)的计算机上运行,所有适配器都连接到不同的内部网络 我需要获得一个特定适配器的ip地址,以便在我的应用程序中使用,问题是我对该适配器的信息了解不够。 适配器的名称不是常数,它们之间的网络屏蔽或它们的连接顺序(即索引)也不是常数 我也不能依赖于使用适配器ping地址,因为正如我所说,它们连接到不同的网络(因此可以从多个网络中提取特定地址),而且并非所有适配器都必须始终连接到网络 我对适配器的了解如下: 对于所有适配器,IP地址都是静态的(当然,在许多机器上

我的应用程序在有多个网络适配器(2-4个)的计算机上运行,所有适配器都连接到不同的内部网络

我需要获得一个特定适配器的ip地址,以便在我的应用程序中使用,问题是我对该适配器的信息了解不够。 适配器的名称不是常数,它们之间的网络屏蔽或它们的连接顺序(即索引)也不是常数

我也不能依赖于使用适配器ping地址,因为正如我所说,它们连接到不同的网络(因此可以从多个网络中提取特定地址),而且并非所有适配器都必须始终连接到网络

我对适配器的了解如下:

  • 对于所有适配器,IP地址都是静态的(当然,在许多机器上的应用程序之间是不同的)
  • 我需要的适配器是计算机车载适配器
是否有其他信息\技术\黑暗巫术可用于识别特定适配器


我的应用程序在C#-.Net 4中运行,但由于这一点非常关键,我会使用应用程序中的每种CLI、包装或脚本语言来解决这个问题。

您需要使用pInvoke GetBestInterface(),然后找到具有该索引的接口,并获取其IpAddress

[System.Runtime.InteropServices.DllImport("iphlpapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex);

    private string GetCorrectIPAddress(string server_ip_string)
    {
        string correctIpAddress = "";

        System.Net.IPAddress server_IpAddress = System.Net.Dns.GetHostEntry("server_ip_string").AddressList[0];

        UInt32 ipv4AddressAsUInt32 = BitConverter.ToUInt32(server_IpAddress.GetAddressBytes(), 0);
        UInt32 interfaceindex;

        int result = GetBestInterface(ipv4AddressAsUInt32, out interfaceindex);
        foreach (System.Net.NetworkInformation.NetworkInterface nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
        {
            System.Net.NetworkInformation.IPInterfaceProperties ipProps = nic.GetIPProperties();
            if (ipProps.GetIPv4Properties().Index == interfaceindex)
            {
                correctIpAddress = ipProps.UnicastAddresses[0].Address.ToString();
            }
        }
        return correctIpAddress;
    }

在设备管理器网络适配器中有一个位置。不确定0是否始终表示在机。我不知道如何在.NET中获取这些信息。我试图沿着这条路走下去,但据我所知,板载适配器的0索引取决于使用的主板类型。和我的问题中的许多其他因素一样,它不是常数。从我读到的GetBestInterface检索到与给定地址具有最佳连接的接口(我猜您建议中的服务器ip字符串)。这并不好,因为不同的接口连接到不同的网络。每个给定的IP地址都可以映射到每个不同网络上的不同机器,因此所有接口都可能与给定地址有很好的连接,但这些是不同的机器。顺便说一句,不要在这上面花太多时间,它已经使用了三年,而且这个系统已经被替换了。