在互联网上有几个地方告诉你如何获得一个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的代码,以便能够遍历每个NetworkInterfaceType。
public static string GetLocalIPv4 (NetworkInterfaceType _type) {
string output = null;
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces ()) {
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) {
foreach (UnicastIPAddressInformation ip in item.GetIPProperties ().UnicastAddresses) {
if (ip.Address.AddressFamily == AddressFamily.InterNetwork) {
output = ip.Address.ToString ();
}
}
}
}
return output;
}
你可以这样称呼它:
static void Main (string[] args) {
// Get all possible enum values:
var nitVals = Enum.GetValues (typeof (NetworkInterfaceType)).Cast<NetworkInterfaceType> ();
foreach (var nitVal in nitVals) {
Console.WriteLine ($"{nitVal} => {GetLocalIPv4 (nitVal) ?? "NULL"}");
}
}
下面是一个修改后的版本(来自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语句,以使该方法更有效。