C#本地IP不适用于多以太网

C#本地IP不适用于多以太网,c#,ip,ethernet,dhcp,C#,Ip,Ethernet,Dhcp,我需要获取PC的本地IP地址,但如果PC连接到多个网络,则IP不正确 我正在使用: public static string GetIPAddress() { IPHostEntry host; string localIP = "?"; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.

我需要获取PC的本地IP地址,但如果PC连接到多个网络,则IP不正确

我正在使用:

public static string GetIPAddress()
        {
            IPHostEntry host;
            string localIP = "?";
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    localIP = ip.ToString();
                }
            }
            return localIP;
        }
比如:

我需要使用internet或所有本地ip地址获取适配器的本地ip。

我可以看到两个选项:

选项1

使用
System.Net.NetworkInformation
通过所有接口进行循环:

static List<IPAddress> GetIpAddress()
{
    List<IPAddress> AllIps = new List<IPAddress>();

    foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces())
    {

        IPInterfaceProperties properties = netif.GetIPProperties();

        foreach (IPAddressInformation unicast in properties.UnicastAddresses)
        {
            AllIps.Add(unicast.Address);
            Console.WriteLine(unicast.Address);
        }
    }

    return AllIps;
}
现在,您可以组合这两个选项以查找连接到internet的接口。我建议将默认网关与正确的适配器地址相匹配。
您还可以确定 使用我添加的代码中编写的
IpClass
枚举:

static void Main(string[] args)
{
    // find all interfaces ip adressess
    var allAdaptersIp = GetIpAddress();
    // find the default gateway
    var dg = GetDefaultGateway();
    // match the default gateway to the host address => the interface that is connected to the internet => that print host address
    Console.WriteLine("ip address that will route you to the world: " + GetInterNetworkHostIp(ref allAdaptersIp, dg, IpClass.ClassC));
    Console.ReadLine();
}

enum IpClass
{
    ClassA,
    ClassB,
    ClassC
}

static string GetInterNetworkHostIp(ref List<IPAddress> adapters, IPAddress dg, IpClass ipclassenum)
{
    string networkAddress = "";
    var result = "" ;

    switch (ipclassenum)
    {
        case IpClass.ClassA:
            networkAddress  = dg.ToString().Substring(0, dg.ToString().Length - dg.ToString().LastIndexOf(".") ); 
            break;
        case IpClass.ClassB:
            networkAddress = dg.ToString().Substring(0, dg.ToString().Length - dg.ToString().IndexOf(".",3));
            break;
        case IpClass.ClassC:
            networkAddress = dg.ToString().Substring(0, dg.ToString().Length- dg.ToString().IndexOf(".") );
            break;
        default:

            break;
    }

    foreach (IPAddress ip in adapters)
    {
        if (ip.ToString().Contains(networkAddress))
        {
            result = ip.ToString();
            break;
        }
    }

    if (result == "")
        result = "no ip was found";

    return result;
}
static void Main(字符串[]args)
{
//查找所有接口ip地址
var allAdaptersIp=GetIpAddress();
//查找默认网关
var dg=GetDefaultGateway();
//将默认网关与主机地址=>连接到internet的接口=>匹配以打印主机地址
WriteLine(“将您路由到世界的ip地址:+GetInterNetworkHostIp(参考allAdaptersIp,dg,IpClass.ClassC));
Console.ReadLine();
}
枚举IpClass
{
甲级,
B类,
C类
}
静态字符串GetInterNetworkHostIp(参考列表适配器、IPAddress dg、IpClass ipclassenum)
{
字符串networkAddress=“”;
var结果=”;
开关(ipclassenum)
{
案例IpClass.ClassA:
networkAddress=dg.ToString().Substring(0,dg.ToString().Length-dg.ToString().LastIndexOf(“.”);
打破
案例IpClass.ClassB:
networkAddress=dg.ToString().Substring(0,dg.ToString().Length-dg.ToString().IndexOf(“.”,3));
打破
案例IpClass.ClassC:
networkAddress=dg.ToString().Substring(0,dg.ToString().Length-dg.ToString().IndexOf(“.”);
打破
违约:
打破
}
foreach(适配器中的ip地址ip)
{
如果(ip.ToString()包含(网络地址))
{
结果=ip.ToString();
打破
}
}
如果(结果==“”)
结果=“未找到ip”;
返回结果;
}
我可以看到两个选项:

选项1

使用
System.Net.NetworkInformation
通过所有接口进行循环:

static List<IPAddress> GetIpAddress()
{
    List<IPAddress> AllIps = new List<IPAddress>();

    foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces())
    {

        IPInterfaceProperties properties = netif.GetIPProperties();

        foreach (IPAddressInformation unicast in properties.UnicastAddresses)
        {
            AllIps.Add(unicast.Address);
            Console.WriteLine(unicast.Address);
        }
    }

    return AllIps;
}
现在,您可以组合这两个选项以查找连接到internet的接口。我建议将默认网关与正确的适配器地址相匹配。
您还可以确定 使用我添加的代码中编写的
IpClass
枚举:

static void Main(string[] args)
{
    // find all interfaces ip adressess
    var allAdaptersIp = GetIpAddress();
    // find the default gateway
    var dg = GetDefaultGateway();
    // match the default gateway to the host address => the interface that is connected to the internet => that print host address
    Console.WriteLine("ip address that will route you to the world: " + GetInterNetworkHostIp(ref allAdaptersIp, dg, IpClass.ClassC));
    Console.ReadLine();
}

enum IpClass
{
    ClassA,
    ClassB,
    ClassC
}

static string GetInterNetworkHostIp(ref List<IPAddress> adapters, IPAddress dg, IpClass ipclassenum)
{
    string networkAddress = "";
    var result = "" ;

    switch (ipclassenum)
    {
        case IpClass.ClassA:
            networkAddress  = dg.ToString().Substring(0, dg.ToString().Length - dg.ToString().LastIndexOf(".") ); 
            break;
        case IpClass.ClassB:
            networkAddress = dg.ToString().Substring(0, dg.ToString().Length - dg.ToString().IndexOf(".",3));
            break;
        case IpClass.ClassC:
            networkAddress = dg.ToString().Substring(0, dg.ToString().Length- dg.ToString().IndexOf(".") );
            break;
        default:

            break;
    }

    foreach (IPAddress ip in adapters)
    {
        if (ip.ToString().Contains(networkAddress))
        {
            result = ip.ToString();
            break;
        }
    }

    if (result == "")
        result = "no ip was found";

    return result;
}
static void Main(字符串[]args)
{
//查找所有接口ip地址
var allAdaptersIp=GetIpAddress();
//查找默认网关
var dg=GetDefaultGateway();
//将默认网关与主机地址=>连接到internet的接口=>匹配以打印主机地址
WriteLine(“将您路由到世界的ip地址:+GetInterNetworkHostIp(参考allAdaptersIp,dg,IpClass.ClassC));
Console.ReadLine();
}
枚举IpClass
{
甲级,
B类,
C类
}
静态字符串GetInterNetworkHostIp(参考列表适配器、IPAddress dg、IpClass ipclassenum)
{
字符串networkAddress=“”;
var结果=”;
开关(ipclassenum)
{
案例IpClass.ClassA:
networkAddress=dg.ToString().Substring(0,dg.ToString().Length-dg.ToString().LastIndexOf(“.”);
打破
案例IpClass.ClassB:
networkAddress=dg.ToString().Substring(0,dg.ToString().Length-dg.ToString().IndexOf(“.”,3));
打破
案例IpClass.ClassC:
networkAddress=dg.ToString().Substring(0,dg.ToString().Length-dg.ToString().IndexOf(“.”);
打破
违约:
打破
}
foreach(适配器中的ip地址ip)
{
如果(ip.ToString()包含(网络地址))
{
结果=ip.ToString();
打破
}
}
如果(结果==“”)
结果=“未找到ip”;
返回结果;
}

您正在迭代列表,但只返回最后一次点击。你有没有检查过列表中是否有正确的一个?你正在迭代列表,但只返回最后一个点击。你有没有仔细检查一下清单上是否有正确的答案?