C#本地IP不适用于多以太网
我需要获取PC的本地IP地址,但如果PC连接到多个网络,则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.
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”;
返回结果;
}
您正在迭代列表,但只返回最后一次点击。你有没有检查过列表中是否有正确的一个?你正在迭代列表,但只返回最后一个点击。你有没有仔细检查一下清单上是否有正确的答案?