質問

ネットマスクがサポートするホストの数をプログラムで確認するにはどうすればよいですか。

たとえば、 /30 がある場合、ルックアップ テーブルを使用せずに、そこに含まれる IP の数をどのように確認しますか?

255.xxx.xxx.xxx 表記ではなく、「/」表記を使用できることが望ましいです。

役に立ちましたか?

解決

式は次のとおりです。2 ^ (32 - ネットマスク) - 2 ここで、ネットマスクは、上記のシスコの表記法で示したビット数です。したがって、/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のホストが可能です32-24 = 8

8^2 = 256

/23で512人のホストが可能です32-23 = 9

9^2 = 512

これはサブネットマスクのビット表現が原因です

255.255.255.252 を変換すると、

11111111.11111111.11111111.11111100

最後の 2 バイトは = 0 であることに注意してください。これは 32 - 30 = 2 と同じ 2 です。

また、すべてのサブネットで 2 つの IP (ブロードキャスト アドレスとゲートウェイ アドレスの 1 つ) が失われます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top