программно найти количество хостов в сетевой маске

StackOverflow https://stackoverflow.com/questions/98916

  •  01-07-2019
  •  | 
  •  

Вопрос

Как программно найти количество хостов, поддерживаемых маской сети?

Например, если у вас есть /30 , как узнать, сколько в нем IP-адресов, не используя таблицу поиска?

Предпочтительно иметь возможность работать с обозначением «/», а не с обозначением 255.xxx.xxx.xxx.

Это было полезно?

Решение

Вот формула:2 ^ (32 — сетевая маска) — 2, где сетевая маска — это количество бит, как показано в обозначениях Cisco выше.Таким образом, сеть с маской /30 имеет 2 пригодных адреса.

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

Для стандартной записи преобразуйте сетевую маску aaa.bbb.ccc.ddd в беззнаковое 4-байтовое целое число (во многих сетевых библиотеках есть эта функция) и вычтите его из 2 ^ 32 - 2.

Другие советы

Где n — число после '/'

>>> def number_of_hosts(n):
...     return 2 ** (32 - n)
... 
>>> number_of_hosts(32)
1
>>> number_of_hosts(30)
4

Метод 1:

 package com.test;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

public class EasyNet {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
              InetAddress localhost = InetAddress.getLocalHost();
              System.out.println(" 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) {
                System.out.println(" Full list of IP addresses:");
                for (int i = 0; i < allMyIps.length; i++) {
                  System.out.println("    " + allMyIps[i]);
                }
              }
            } catch (UnknownHostException e) {
              System.out.println(" (error retrieving server host name)");
            }

            try {
              System.out.println("Full list of Network Interfaces:");
              for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                System.out.println("    " + intf.getName() + " " + intf.getDisplayName());
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) 
                {
                  System.out.println("        " + enumIpAddr.nextElement().toString());
                }
              }
            } catch (SocketException e) {
              System.out.println(" (error retrieving network interface list)");
            }
    }

}

Метод 2:

package com.test;

import java.net.*;
import java.util.*;

public class GetIp {

  public static void main(String args[]) throws Exception {

  Enumeration<NetworkInterface> nets = 
  NetworkInterface.getNetworkInterfaces();

  for (NetworkInterface netint : Collections.list(nets)) {
  System.out.println("\nDisplay name : " + netint.getDisplayName());

  Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();

  for (InetAddress inetAddress : Collections.list(inetAddresses)) {

  System.out.println("InetAddress : " + inetAddress);
  }
  }
  }
}

Способ 3

package com.test;

import java.io.IOException;
import java.net.InetAddress;

public class Nethosts {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
        InetAddress localhost = InetAddress.getLocalHost();
        // this code assumes IPv4 is used
        byte[] ip = localhost.getAddress();
        checkHosts(ip.toString());
        }
        catch(Exception e){
            e.printStackTrace();
        }


    }
    public static void checkHosts(String subnet){
           int timeout=1000;
           for (int i=1;i<254;i++){
               try{
               String host=subnet + "." + i;
               if (InetAddress.getByName(host).isReachable(timeout)){
                   System.out.println(host + " is reachable");
               }
               }
               catch(IOException e){e.printStackTrace();}
           }
        }
}

Метод 4:

package com.test;

import java.awt.List;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Enumeration;

public class Netintr {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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();
             ArrayList<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 = (ArrayList<InterfaceAddress>) 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();
          }

    }


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

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

}

Способ 5

package com.test;

import java.io.IOException;
import java.net.InetAddress;

public class NetworkPing {

    /**
     * JavaProgrammingForums.com
     */
    public static void main(String[] args) throws IOException {

        InetAddress localhost = InetAddress.getLocalHost();
        // this code assumes IPv4 is used
        byte[] ip = localhost.getAddress();

        for (int i = 1; i <= 254; i++)
        {
            ip[3] = (byte)i;
            InetAddress address = InetAddress.getByAddress(ip);
        if (address.isReachable(1000))
        {
            System.out.println(address + " machine is turned on and can be pinged");
        }
        else if (!address.getHostAddress().equals(address.getHostName()))
        {
            //hostName is the Machine name and hostaddress is the ip addr
            System.out.println(address + " machine is known in a DNS lookup");
        }
        else
        {
            System.out.println(address + " the host address and host name are equal, meaning the host name could not be resolved");
        }
        }

    }
}

Способ 6

package com.test;

import java.net.*;
import java.util.*;

public class NIC {

public static void main(String args[]) throws Exception {

    List<InetAddress> addrList = new ArrayList<InetAddress>();
    Enumeration<NetworkInterface> interfaces = null;
    try {
        interfaces = NetworkInterface.getNetworkInterfaces();
    } catch (SocketException e) {
        e.printStackTrace();
    }

    InetAddress localhost = null;

    try {
        localhost = InetAddress.getByName("127.0.0.1");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

    while (interfaces.hasMoreElements()) {
        NetworkInterface ifc = interfaces.nextElement();
        Enumeration<InetAddress> addressesOfAnInterface = ifc.getInetAddresses();

        while (addressesOfAnInterface.hasMoreElements()) {
            InetAddress address = addressesOfAnInterface.nextElement();

            if (!address.equals(localhost) && !address.toString().contains(":")) {
                addrList.add(address);
                System.out.println("FOUND ADDRESS ON NIC: " + address.getHostAddress());
            }
        }
    }

}
}

http://www.unixwiz.net/techtips/netmask-ref.html

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

2^(32-n) – 2, где n – ваш номер, в данном случае 30.Число n дает вам количество бит, охватываемых диапазоном адресов, что дает вам 32-n бит, оставшихся для вашей сети.Следовательно, всего существует 2^(32-n) возможных адресов.Вы вычитаете 2 для сетевых и широковещательных адресов, чтобы получить ответ.

с /30 у вас есть только 4 хоста.

32-30 = 2

2^2 = 4

с /24 у вас есть 256 хостов.

8^2 = 256

с /23 у вас есть 512 хоста возможны 32-23 = 9

9^2 = 512

это из-за битового представления маски подсети

255.255.255.252 переводится как

11111111.11111111.11111111.11111100

обратите внимание, что два последних байта = 0.это то же самое 2, что и в 32 - 30 = 2

Кроме того, вы теряете 2 IP-адреса в каждой подсети: один для широковещательного адреса и один для адреса шлюза.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top