небольшой код сканера ip в java - PullRequest
3 голосов
/ 28 марта 2011

Я пишу небольшую игру на Java.Там есть сервер и клиентский модуль.На данный момент каждый клиент должен ввести IP-адрес сервера (в локальной сети) вручную.Вот почему я написал этот код здесь:

import java.net.*;


public class myIP {

public static void main (String argv[]) 
{ 
    try{
          InetAddress ownIP=InetAddress.getLocalHost();
          String myIP = ownIP.getHostAddress();
          System.out.println( "IP of my system is := "+ myIP );
        }catch (Exception e){
          System.out.println( "Exception caught ="+e.getMessage() );
        }
      }
}

Этот фрагмент кода возвращает IP-адрес машины.Имея эту информацию (мой собственный IP-адрес), я хотел бы проверить другие IP-адреса в этом диапазоне, чтобы автоматически находить сервер.

Теперь я не знаю, как выполнить итерацию в этом диапазоне IP.Например: если «myIP» - 10.0.0.5, как я могу изменить эту строку, чтобы у меня был, например, 10.0.0.6?Если бы это было целочисленное значение, было бы легко добавить 1 каждый раз - но так как это строка - разделенная точками - я не уверен, как это решить :) любая идея?

ура

Ответы [ 4 ]

4 голосов
/ 28 марта 2011

Как правило, это достигается с помощью широковещательной / многоадресной рассылки.Это не то, с чем я когда-либо играл, поэтому не могу предложить вам какой-либо код, но эта ссылка предлагает хорошее объяснение.

Редактировать: оно выходит за пределы MulticastSocket класс, который вы можете использовать.

2 голосов
/ 28 марта 2011

Итак, вам нужно преобразовать IPv4-адрес в Int и обратно.

Посмотрите, поможет ли это:

http://teneo.wordpress.com/2008/12/23/java-ip-address-to-integer-and-back/

0 голосов
/ 28 марта 2011

Вот пример кода из TechnoJeeves , чтобы сделать это.

import java.net.InetAddress;

public class ScanNet {
    public static void main(String[] args) throws Exception {
    int[] bounds = ScanNet.rangeFromCidr("192.168.1.255/24");

    for (int i = bounds[0]; i <= bounds[1]; i++) {
        String address = InetRange.intToIp(i);
        InetAddress ip = InetAddress.getByName(address);

        if (ip.isReachable(100)) { // Try for one tenth of a second
            System.out.printf("Address %s is reachable\n", ip);
        }
    }
}

public static int[] rangeFromCidr(String cidrIp) {
    int maskStub = 1 << 31;
    String[] atoms = cidrIp.split("/");
    int mask = Integer.parseInt(atoms[1]);
    System.out.println(mask);

    int[] result = new int[2];
    result[0] = InetRange.ipToInt(atoms[0]) & (maskStub >> (mask - 1)); // lower bound
    result[1] = InetRange.ipToInt(atoms[0]); // upper bound
    System.out.println(InetRange.intToIp(result[0]));
    System.out.println(InetRange.intToIp(result[1]));

    return result;
}

static class InetRange {
    public static int ipToInt(String ipAddress) {
        try {
            byte[] bytes = InetAddress.getByName(ipAddress).getAddress();
            int octet1 = (bytes[0] & 0xFF) << 24;
            int octet2 = (bytes[1] & 0xFF) << 16;
            int octet3 = (bytes[2] & 0xFF) << 8;
            int octet4 = bytes[3] & 0xFF;
            int address = octet1 | octet2 | octet3 | octet4;

            return address;
        } catch (Exception e) {
            e.printStackTrace();

            return 0;
        }
    }

    public static String intToIp(int ipAddress) {
        int octet1 = (ipAddress & 0xFF000000) >>> 24;
        int octet2 = (ipAddress & 0xFF0000) >>> 16;
        int octet3 = (ipAddress & 0xFF00) >>> 8;
        int octet4 = ipAddress & 0xFF;

        return new StringBuffer().append(octet1).append('.').append(octet2)
                                 .append('.').append(octet3).append('.')
                                 .append(octet4).toString();
    }
} }
0 голосов
/ 28 марта 2011

Вы должны getAddress, который возвращает ip как байтовый массив вместо getHostAdress.

...