在互联网上有几个地方告诉你如何获得一个IP地址。很多都像这个例子:
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();
在这个例子中,我得到了几个IP地址,但我只对路由器分配给运行程序的计算机的IP地址感兴趣:例如,如果某人希望访问我计算机中的共享文件夹,我将给他的IP地址。
如果我没有连接到网络,我直接通过没有路由器的调制解调器连接到互联网,那么我希望得到一个错误。我如何才能看到我的计算机是否连接到网络与c#,如果它是然后得到局域网IP地址。
下面是一个修改后的版本(来自compman2408的版本),它对我来说很有效:
internal static string GetLocalIPv4(NetworkInterfaceType _type)
{ // Checks your IP adress from the local network connected to a gateway. This to avoid issues with double network cards
string output = ""; // default output
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) // Iterate over each network interface
{ // Find the network interface which has been provided in the arguments, break the loop if found
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{ // Fetch the properties of this adapter
IPInterfaceProperties adapterProperties = item.GetIPProperties();
// Check if the gateway adress exist, if not its most likley a virtual network or smth
if (adapterProperties.GatewayAddresses.FirstOrDefault() != null)
{ // Iterate over each available unicast adresses
foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses)
{ // If the IP is a local IPv4 adress
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{ // we got a match!
output = ip.Address.ToString();
break; // break the loop!!
}
}
}
}
// Check if we got a result if so break this method
if (output != "") { break; }
}
// Return results
return output;
}
你可以像这样调用这个方法:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
变化:我正在从一个适配器中检索IP,该适配器已分配了一个网关IP。
第二个变化:我添加了文档字符串和break语句,以使该方法更有效。
已经有很多答案了,但我还是贡献我的一个:
public static IPAddress LocalIpAddress() {
Func<IPAddress, bool> localIpPredicate = ip =>
ip.AddressFamily == AddressFamily.InterNetwork &&
ip.ToString().StartsWith("192.168"); //check only for 16-bit block
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(localIpPredicate);
}
一个衬套:
public static IPAddress LocalIpAddress() => Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork && ip.ToString().StartsWith("192.168"));
注意:从last开始搜索,因为它在一些接口添加到设备后仍然有效,如MobileHotspot,VPN或其他花哨的虚拟适配器。