2008-09-19 1 views
1

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

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

Желательно использовать нотацию «/», а не 255.xxx.xxx.xxx.

ответ

3

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

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

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

0

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

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

+0

бы скорее увидеть автономные комментарии, как другие сайты могут перемещать их информацию вокруг или даже исчезают. – paxdiablo 2008-09-19 03:54:25

2

где п является число после «/»

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

Я осмелюсь сказать, что в любое время, когда вы используете 2 ** x в целочисленном контексте, вероятно, более идиоматично писать 1 << x, вместо этого. : -P – 2008-09-19 02:20:17

+0

запомнить вычесть 2 для широковещательных и сетевых адресов. – 2008-09-19 02:20:22

0

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

0

с/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. это же 2, как и в 32 - 30 = 2

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

2

Метод 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()); 
      } 
     } 
    } 

} 
} 
Смежные вопросы