Как я могу получить локальный IP в.NET?

Какие преимущества имеет реализация Дастина по сравнению с классом WPF WeakEventManager, который просто оборачивает целевой объект, а также делегат в слабую ссылку:

public Listener(object target, Delegate handler)
  {
       this._target = new WeakReference(target);
       this._handler = new WeakReference((object) handler);
  }

На мой взгляд, этот подход более гибкий, поскольку не требуется, чтобы реализация передавала целевой экземпляр в качестве параметра во время вызова обработчика события:

public void Invoke(object sender, E e)
        {
            T target = (T)m_TargetRef.Target;

            if (target != null)
                m_OpenHandler(target, sender, e);

Это также позволяет использовать аномимные методы вместо метода экземпляра (который, кажется, также недостаток реализации Дастина).

5
задан Refracted Paladin 5 June 2009 в 16:40
поделиться

5 ответов

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

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();     
9
ответ дан 18 December 2019 в 09:52
поделиться

Похоже, ваш сценарий вызывает 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();
}

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

2
ответ дан 18 December 2019 в 09:52
поделиться

Это потому, что json не имеет разницы между строковыми объектами и объектами Unicode. Это все строки в javascript.

Я думаю, JSON подходит для возврата объектов Unicode . Фактически, я бы не принял ничего меньшего, поскольку строки javascript на самом деле являются объектами unicode (то есть строки JSON (javascript) могут хранить любой unicode) символ), поэтому имеет смысл создавать объекты unicode при переводе строк из JSON. Простые строки просто не подходят, так как библиотека должна угадать нужную кодировку.

Лучше использовать строковые объекты unicode везде. Поэтому лучший вариант - обновить библиотеки, чтобы они могли работать с объектами Unicode.

Но если вам действительно нужны строки байтов,

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

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

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

IPAddress localAddr = Dns.GetHostEntry("").AddressList[0];
5
ответ дан 18 December 2019 в 09:52
поделиться

Я лично порекомендовал бы используя 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, но может потребоваться некоторая настройка.

1
ответ дан 18 December 2019 в 09:52
поделиться

Вы можете пролистать это, чтобы найти все 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 
    }
0
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: