可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have the following vbscript code that returns the local IP address. It works great. I am trying to provide the same functionality in my winform .net app.
All the solutions I have come across involve using DNS. Any ideas on how to "port" this script for use in .net?
A different way to do this maybe?
Thanks!
Function GetIP()
Dim ws : Set ws = CreateObject("WScript.Shell")
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim TmpFile : TmpFile = fso.GetSpecialFolder(2) & "/ip.txt"
Dim ThisLine, IP
If ws.Environment("SYSTEM")("OS") = "" Then
ws.run "winipcfg /batch " & TmpFile, 0, True
Else
ws.run "%comspec% /c ipconfig > " & TmpFile, 0, True
End If
With fso.GetFile(TmpFile).OpenAsTextStream
Do While NOT .AtEndOfStream
ThisLine = .ReadLine
If InStr(ThisLine, "Address") <> 0 Then IP = Mid(ThisLine, InStr(ThisLine, ":") + 2)
Loop
.Close
End With
If IP <> "" Then
If Asc(Right(IP, 1)) = 13 Then IP = Left(IP, Len(IP) - 1)
End If
GetIP = IP
fso.GetFile(TmpFile).Delete
Set fso = Nothing
Set ws = Nothing
End Function
回答1:
You can do this by querying the network interfaces, though this will include all local addresses so you may have to add a where
clause to select the one you want if there are multiple interfaces (which there likely will be). It's certainly not a direct port of your script, but hopefully will be of some use:
var localAddress =
(from ni in NetworkInterface.GetAllNetworkInterfaces()
where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback
let props = ni.GetIPProperties()
from ipAddress in props.UnicastAddresses
select ipAddress).FirstOrDefault();
Note: If you only want IPv4 addresses, then you could alter the query to:
var localAddress =
(from ni in NetworkInterface.GetAllNetworkInterfaces()
where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback
let props = ni.GetIPProperties()
from ipAddress in props.UnicastAddresses
where ipAddress.AddressFamily == AddressFamily.InterNetwork // IPv4
select ipAddress).FirstOrDefault();
回答2:
using System.Net;
IPAddress localAddr = Dns.GetHostEntry(Dns.GetHostName().ToString()).AddressList[0];
[edit] hmmmm...just realized that you mentioned you don't want to use DNS...why is that?
[edit] moving up from comments....
Simpler version if you only care about local, empty string pass to GetHostEntry will by default return local only
IPAddress localAddr = Dns.GetHostEntry("").AddressList[0];
回答3:
It looks like your script is calling ipconfig, saving the output to a file, and then parsing the file. If you want to do that, you would do something like this:
using System.Threading;
...
static void Main(string[] args)
{
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo("ipconfig");
psi.CreateNoWindow = true;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
p.StartInfo = psi;
p.Start();
string s = p.StandardOutput.ReadToEnd();
int startPos = s.IndexOf(":", s.IndexOf("IPv4 Address"));
string output = s.Substring(startPos + 2, s.IndexOf("\r\n", startPos) - startPos - 2);
Console.WriteLine(output);
Console.ReadLine();
}
Note that I'm not particularly fond of this method -- you would probably be better served with some of the other solutions listed in this thread -- but it is a more direct translation of your original script.
回答4:
I personally would recommend using the DNS, but if you absolutely don't want to you can get the information from a call to the System.Management namespace
string ipAddress = "";
ManagementObjectSearcher query =
new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
ManagementObjectCollection queryCollection = query.Get();
foreach (ManagementObject mo in queryCollection)
{
string[] addresses = (string[]) mo["IPAddress"];
if (addresses.Length == 1 && addresses[0] != "0.0.0.0")
{
ipAddress = addresses[0];
break;
}
}
Console.WriteLine(ipAddress);
That should correctly get the ip but may need some tweaking.
回答5:
You can scroll through this to find all ip addresses.
String hostName = Dns.GetHostName();
IPHostEntry local = Dns.GetHostByName(hostName);
foreach (IPAddress ipaddress in local.AddressList)
{
ipaddress.ToString(); //this gives you the IP address
//logic here
}