long unsigned int ipToInt(unsigned char ip[])
{
return ((ip[0]*256 + ip[1])*256 + ip[2])*256 + ip[3];
}
void intToIp(int i, char ip[])
{
char* p = (char*) &i;
ip[0] = p[3];
ip[1] = p[2];
ip[2] = p[1];
ip[3] = p[0];
}
void print_ip(char* ip)
{
// спецификаторы формата для lcc...
printf("%hhu.%hhu.%hhu.%hhu\n", ip[0], ip[1], ip[2], ip[3]);
}
// ... main ...
char loopIp[4], ip1[4] = {192, 168, 1, 1}, ip2[4] = {192, 168, 4, 128};
long unsigned int i1, i2;
i1 = ipToInt(ip1);
i2 = ipToInt(ip2);
for (int i = i1; i <= i2; i++)
{
intToIp(i, loopIp);
print_ip(loopIp);
}
Перебор IP диапазона
Каким образом можно перебрать диапазон IP адресов? Например с 192.168.1.1 до 192.168.4.128?
Спасибо.
привести оба адреса к 32-разрядным целым числам (ip -- это стурктура из 4-х 1-байтных чисел, если не знаете) и сделать цикл от меньшего числа к большему. в цикле производить обратное преобразование счётчика к ip
Цитата: LM(AL/M)
привести оба адреса к 32-разрядным целым числам (ip -- это стурктура из 4-х 1-байтных чисел, если не знаете) и сделать цикл от меньшего числа к большему. в цикле производить обратное преобразование счётчика к ip
не могли бы Вы привести пример, а то все-равно не соображу?
если предположить что для хранения ip-адреса используется массив, то вот
я так полагаю, LM(AL/M) вам рассказал
В perl для этого использую Net::IP, думал что на java есть что-то подобное
да, получается что именно это я и рассказал ), но это только потому что для примера я выбрал самую простую (для меня) реализацию intToIp(), если же там не использовать хак с приведением типов, а сделать через сдвиги и бинарные операции то порядок байт принятый в системе на аппаратном уровне будет безразличен
Код:
public class Main {
public static int ipToInt(char ip[]) {
return ((ip[0]*256 + ip[1])*256 + ip[2])*256 + ip[3];
}
public static String intToIp(long i) {
return ((i >> 24 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
((i >> 8 ) & 0xFF) + "." +
( i & 0xFF);
}
public static void print_ip(char[] ip) {
System.out.println("qwe" + ip[0]);
}
public static void main(String[] args) {
char[] ip1 = new char[4];
ip1[0] = 192;
ip1[1] = 168;
ip1[2] = 1;
ip1[3] = 1;
char[] ip2 = new char[4];
ip2[0] = 192;
ip2[1] = 168;
ip2[2] = 2;
ip2[3] = 128;
long i1;
long i2;
i1 = ipToInt(ip1);
i2 = ipToInt(ip2);
System.out.println(i1);
System.out.println(i2);
for (long i = i1; i <= i2; i++) {
String result;
result = intToIp(i);
System.out.println(result);
}
}
}
public static int ipToInt(char ip[]) {
return ((ip[0]*256 + ip[1])*256 + ip[2])*256 + ip[3];
}
public static String intToIp(long i) {
return ((i >> 24 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
((i >> 8 ) & 0xFF) + "." +
( i & 0xFF);
}
public static void print_ip(char[] ip) {
System.out.println("qwe" + ip[0]);
}
public static void main(String[] args) {
char[] ip1 = new char[4];
ip1[0] = 192;
ip1[1] = 168;
ip1[2] = 1;
ip1[3] = 1;
char[] ip2 = new char[4];
ip2[0] = 192;
ip2[1] = 168;
ip2[2] = 2;
ip2[3] = 128;
long i1;
long i2;
i1 = ipToInt(ip1);
i2 = ipToInt(ip2);
System.out.println(i1);
System.out.println(i2);
for (long i = i1; i <= i2; i++) {
String result;
result = intToIp(i);
System.out.println(result);
}
}
}
Огромное спасибо за помощь!