Как я могу получить локальный IP в .NET? - PullRequest
5 голосов
/ 05 июня 2009

У меня есть следующий код VBScript, который возвращает локальный IP-адрес. Работает отлично. Я пытаюсь обеспечить ту же функциональность в моем приложении winform .net.

Все решения, с которыми я сталкивался, включают использование DNS. Любые идеи о том, как "портировать" этот скрипт для использования в .net?

Может быть, другой способ сделать это?

Спасибо!

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

Ответы [ 5 ]

9 голосов
/ 05 июня 2009

Вы можете сделать это, запросив сетевые интерфейсы, хотя это будет включать все локальные адреса, поэтому вам, возможно, придется добавить предложение where, чтобы выбрать тот, который вы хотите, если есть несколько интерфейсов (которые, вероятно, будут). Это, конечно, не прямой порт вашего скрипта, но, надеюсь, будет полезным:

var localAddress = 
    (from ni in NetworkInterface.GetAllNetworkInterfaces()
     where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback
     let props = ni.GetIPProperties()
     from ipAddress in props.UnicastAddresses
     select ipAddress).FirstOrDefault();    

Примечание. Если вам нужны только адреса IPv4, вы можете изменить запрос на:

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();     
5 голосов
/ 05 июня 2009
using System.Net;

IPAddress localAddr = Dns.GetHostEntry(Dns.GetHostName().ToString()).AddressList[0];

[править] хмммм ... только что понял, что упомянул, что не хочешь использовать DNS ... почему?

[править] Переход от комментариев ....

Упрощенная версия, если вам нужна только локальная передача пустой строки в GetHostEntry, по умолчанию будет возвращаться только локальная

IPAddress localAddr = Dns.GetHostEntry("").AddressList[0];
2 голосов
/ 05 июня 2009

Похоже, ваш скрипт вызывает ipconfig, сохраняет вывод в файл, а затем анализирует файл. Если вы хотите сделать это, вы бы сделали что-то вроде этого:

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();
}

Обратите внимание, что я не особенно люблю этот метод - вам, вероятно, лучше обойдутся некоторые другие решения, перечисленные в этой теме, - но это более прямой перевод вашего исходного сценария.

1 голос
/ 05 июня 2009

Я бы лично порекомендовал использовать DNS, но если вы абсолютно не хотите этого, вы можете получить информацию из звонка в пространство имен System.Management

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);

Это должно правильно получить IP, но может потребоваться некоторая настройка.

0 голосов
/ 05 июня 2009

Вы можете прокрутить это, чтобы найти все IP-адреса.

    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 
    }
...