Как перечислить IP-адреса всех включенных плат NIC от Java?

Когда вы вызываете include, включенный код наследует область, в которую он был включен. Поэтому, если вы хотите прочитать данные, созданные вне включаемого кода, данные должны находиться в локальной области, и вы можете перенести глобальные переменные в локальную область, используя ключевое слово global или ссылаясь на суперглобальный $ _GLOBAL. Однако это неправильный способ решения проблемы. Другое поведение при включении кода заключается в том, что код оценивается немедленно. Оставляя в стороне проблему загрязнения глобального пространства имен, это потенциально создает проблемы безопасности в вашем приложении - если включаемые файлы доступны напрямую по URL, кто-то может вызвать функциональность, обходя ограничения (такие как проверка аутентификации) в коде, который вызывает «включить», просто указав URL включаемого файла, например

HTTPS://example.com/include/user_admin.inc.php

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

  $fn=include Config::template_dir."/tpl.{$name}.php";
  $fn($var);
45
задан hobs 15 January 2013 в 05:19
поделиться

3 ответа

Это довольно легко:

try {
  InetAddress localhost = InetAddress.getLocalHost();
  LOG.info(" IP Addr: " + localhost.getHostAddress());
  // Just in case this host has multiple IP addresses....
  InetAddress[] allMyIps = InetAddress.getAllByName(localhost.getCanonicalHostName());
  if (allMyIps != null && allMyIps.length > 1) {
    LOG.info(" Full list of IP addresses:");
    for (int i = 0; i < allMyIps.length; i++) {
      LOG.info("    " + allMyIps[i]);
    }
  }
} catch (UnknownHostException e) {
  LOG.info(" (error retrieving server host name)");
}

try {
  LOG.info("Full list of Network Interfaces:");
  for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
    NetworkInterface intf = en.nextElement();
    LOG.info("    " + intf.getName() + " " + intf.getDisplayName());
    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
      LOG.info("        " + enumIpAddr.nextElement().toString());
    }
  }
} catch (SocketException e) {
  LOG.info(" (error retrieving network interface list)");
}
51
ответ дан Eddie 26 November 2019 в 21:13
поделиться

Часть этого будет только работать в JDK 1.6, и выше (один из методов был добавлен в том выпуске.)

List<InetAddress> addrList = new ArrayList<InetAddress>();
for(NetworkInterface ifc : NetworkInterface.getNetworkInterfaces()) {
   if(ifc.isUp()) {
      for(InetAddress addr : ifc.getInetAddresses()) {
        addrList.add(addr);
      }
   }
}

До 1,6, это немного более трудно - isUp (), не поддерживается до тех пор.

FWIW: примечание Javadocs, что это - корректный подход для получения всех IP-адресов для узла:

ПРИМЕЧАНИЕ: может использовать getNetworkInterfaces () +getInetAddresses () для получения всех IP-адресов для этого узла

22
ответ дан Jared 26 November 2019 в 21:13
поделиться

Этот код только работает в Java 1.6 из-за добавленного кода InterfaceAddress.

  try
  {
     System.out.println("Output of Network Interrogation:");
     System.out.println("********************************\n");

     InetAddress theLocalhost = InetAddress.getLocalHost();
     System.out.println(" LOCALHOST INFO");
     if(theLocalhost != null)
     {
        System.out.println("          host: " + theLocalhost.getHostName());
        System.out.println("         class: " + theLocalhost.getClass().getSimpleName());
        System.out.println("            ip: " + theLocalhost.getHostAddress());
        System.out.println("         chost: " + theLocalhost.getCanonicalHostName());
        System.out.println("      byteaddr: " + toMACAddrString(theLocalhost.getAddress()));
        System.out.println("    sitelocal?: " + theLocalhost.isSiteLocalAddress());
        System.out.println("");
     }
     else
     {
        System.out.println(" localhost was null");
     }

     Enumeration<NetworkInterface> theIntfList = NetworkInterface.getNetworkInterfaces();
     List<InterfaceAddress> theAddrList = null;
     NetworkInterface theIntf = null;
     InetAddress theAddr = null;

     while(theIntfList.hasMoreElements())
     {
        theIntf = theIntfList.nextElement();

        System.out.println("--------------------");
        System.out.println(" " + theIntf.getDisplayName());
        System.out.println("          name: " + theIntf.getName());
        System.out.println("           mac: " + toMACAddrString(theIntf.getHardwareAddress()));
        System.out.println("           mtu: " + theIntf.getMTU());
        System.out.println("        mcast?: " + theIntf.supportsMulticast());
        System.out.println("     loopback?: " + theIntf.isLoopback());
        System.out.println("          ptp?: " + theIntf.isPointToPoint());
        System.out.println("      virtual?: " + theIntf.isVirtual());
        System.out.println("           up?: " + theIntf.isUp());

        theAddrList = theIntf.getInterfaceAddresses();
        System.out.println("     int addrs: " + theAddrList.size() + " total.");
        int addrindex = 0;
        for(InterfaceAddress intAddr : theAddrList)
        {
           addrindex++;
           theAddr = intAddr.getAddress();
           System.out.println("            " + addrindex + ").");
           System.out.println("            host: " + theAddr.getHostName());
           System.out.println("           class: " + theAddr.getClass().getSimpleName());
           System.out.println("              ip: " + theAddr.getHostAddress() + "/" + intAddr.getNetworkPrefixLength());
           System.out.println("           bcast: " + intAddr.getBroadcast().getHostAddress());
           int maskInt = Integer.MIN_VALUE >> (intAddr.getNetworkPrefixLength()-1);
           System.out.println("            mask: " + toIPAddrString(maskInt));
           System.out.println("           chost: " + theAddr.getCanonicalHostName());
           System.out.println("        byteaddr: " + toMACAddrString(theAddr.getAddress()));
           System.out.println("      sitelocal?: " + theAddr.isSiteLocalAddress());
           System.out.println("");
        }
     }
  }
  catch (SocketException e)
  {
     e.printStackTrace();
  }
  catch (UnknownHostException e)
  {
     e.printStackTrace();
  }

"toMACAddrString" метод похож на это:

public static String toMACAddrString(byte[] a)
{
  if (a == null)
  {
     return "null";
  }
  int iMax = a.length - 1;

  if (iMax == -1)
  {
     return "[]";
  }

  StringBuilder b = new StringBuilder();
  b.append('[');
  for (int i = 0;; i++)
  {
     b.append(String.format("%1$02x", a[i]));

     if (i == iMax)
     {
        return b.append(']').toString();
     }
     b.append(":");
  }
}

и "toIPAddrString" метод здесь:

public static String toIPAddrString(int ipa)
{
   StringBuilder b = new StringBuilder();
   b.append(Integer.toString(0x000000ff & (ipa >> 24)));
   b.append(".");
   b.append(Integer.toString(0x000000ff & (ipa >> 16)));
   b.append(".");
   b.append(Integer.toString(0x000000ff & (ipa >> 8)));
   b.append(".");
   b.append(Integer.toString(0x000000ff & (ipa)));
   return b.toString();
}

у меня есть тот первый набор кода в попытке/выгоде выше в методе, названном дампом () в классе под названием IPConfig. Затем я просто поместил основной метод в IPConfig для вызова нового IPConfig () .dump () так, чтобы, когда я пытаюсь выяснить некоторую дурацкую сетевую проблему, я видел, что Java думает, продолжается. Я выяснил, что мое поле Fedora сообщает другую информацию, чем Windows для получения информации о LocalHost, и это вызывало мои программы Java некоторые проблемы.

я понимаю ее подобное другим ответам, но это распечатывает почти все интересное, что можно добраться от интерфейса и ipaddress пчелы.

8
ответ дан A.H. 26 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

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