Перебор диапазона ip адресов
Начальные данные
$start = "172.20.1.1";
$end = "172.20.255.255";
Например так.
Заранее благодарен.
Цитата: Robinnovich
Вопрос такой как реализовать перебор в цикле всех ip адресов в заданном диапазоне?
Начальные данные
$start = "172.20.1.1";
$end = "172.20.255.255";
Например так.
Заранее благодарен.
Начальные данные
$start = "172.20.1.1";
$end = "172.20.255.255";
Например так.
Заранее благодарен.
И в чем трабла? В организации цикла?
PHP
ip2long(string ip) / long2ip(int ip)
конвертирует в (/из) signed long int [COLOR="Gray"](хотя unsigned в ПХП и не существует ведь)[/COLOR]
$start = "1.1.1.1";
$end = "255.255.255.255";
Ну так и обходи их по циклу! Приводи функцией ip2long() к целому значению и обходи. В чем затруднение-то?
Вот еще заминка в чем нужно проверить есть ли фтп сервер на этом ип адресе. Быстро перебрать диапазон ип и проварить на наличие фтп не получается.
Пребывал 2 способами
1
Код:
function check_ftp($ftp_host, $port = 21, $timeout = 1){
$ftp = (@ftp_connect($ftp_host, $port, $timeout)) ? "<div style=\"width: 130; float: left; margin-right: 15px; margin-top: 5px; margin-bottom: 5px;\"><a href=\"ftp://$ftp_host\" target=\"_blank\">".$ftp_host."</a></div>" : "";
@ftp_close($ftp);
return $ftp;
}
$ftp = (@ftp_connect($ftp_host, $port, $timeout)) ? "<div style=\"width: 130; float: left; margin-right: 15px; margin-top: 5px; margin-bottom: 5px;\"><a href=\"ftp://$ftp_host\" target=\"_blank\">".$ftp_host."</a></div>" : "";
@ftp_close($ftp);
return $ftp;
}
2
Код:
function url_exists($url){
$fp = @fsockopen($url, 21);
if($fp === false) return false;
return true;
}
$fp = @fsockopen($url, 21);
if($fp === false) return false;
return true;
}
И в обоих случаях когда цикл натыкается на ип на котором нету фтп сервера
Сервак виснет.
Может есть другие способы проверить наличие фтп на компе с определенным ип.
Есть идея но не знаю как реализовать проверить только наличие открытого порта 21.
Ваши идеи…
хотя я лично никогда проверку на наличие открытых портов через сокеты не писал и потому ничего конкретного сказать не могу... посмотрим что скажут эксперты форума
Кажись у fsockopen ф-ии есть еще пара-тройка необязательных параметров, последний из которых - timeout. Попробуй "поиграть" с ним (давно подобным не занимался, а проверить щас негде). Если на 21 порту "другого конца провода" сидит не законченный тормоз, то ИМХО хватит и минимального значения 1-4 (что там по умолчанию - не помню, но вроде несколько больше), либо глянь на инфу по ф-ии socket_set_timeout.
Но в resource fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )
Написано что float timeout пробивал ставить 0,01 но почему-то работает через раз, и то выполнение скрипта 8 сек.
Вот код тот что я написал:
Код:
$start = "172.20.85.61";
$end = "172.20.85.71";
for ($i=ip2long($start); $i<=ip2long($end); $i++){
$ftp_host = long2ip($i);
$fp = @fsockopen($ftp_host, 21, $errno, $errstring, 0.01);
if($fp !== false)
$tmp .= "<div style=\"width: 130; float: left; margin-right: 15px; margin-top: 5px; margin-bottom: 5px;\"><a href=\"ftp://$ftp_host\" target=\"_blank\">".$ftp_host."</a></div>";
@fclose($fp);
}
echo $tmp;
$end = "172.20.85.71";
for ($i=ip2long($start); $i<=ip2long($end); $i++){
$ftp_host = long2ip($i);
$fp = @fsockopen($ftp_host, 21, $errno, $errstring, 0.01);
if($fp !== false)
$tmp .= "<div style=\"width: 130; float: left; margin-right: 15px; margin-top: 5px; margin-bottom: 5px;\"><a href=\"ftp://$ftp_host\" target=\"_blank\">".$ftp_host."</a></div>";
@fclose($fp);
}
echo $tmp;
(З.Ы. ИМХО таймаута 0,01 слишком мало, может я и туплю, но удаленный сервак за такое короткое время может не "родуплиться")
Почему тогда выбор пал на ПХП? Я бы рекомендовал воспользоваться средствами, позволяющими выделить приложению несколько потоков и в каждом из них гонять свою задачу.
При всей моей любви к извращениям, чтобы просканить 4 миллиарда адресов ПХП скриптом, необходимо быть, как бы это помягче, неординарной личностью. [COLOR="Gray"]хотя я раньше баловался... НЕТ! Я всего-лишь обычный человек (С) больше, чем на пару-тройку десятков тысяч меня не хватало.[/COLOR]
[COLOR="DimGray"]Кстати, еще раз напоминаю, адреса вышеописанными ф-ми переводятся в знаковые целые как при переполнении. Т.е. имеем следующее соответствие с диапазонами:
0.0.0.0 - 127.255.255.255 -> 0 - 2147483647
128.0.0.0 - 255.255.255.255 -> -2147483648 - -1
Все отрицательные значение возвращенные ф-ей ip2long так или иначе >=, чем беззнак. 0х80000000 (128.0.0.0).
Адрес не переводится "в лоб" целым диапазоном от минус min. до плюс max. знакового целого, как упорно думает один мой знакомый.[/COLOR]
Это впринцепе все равно для локалки если быть точным то диапазон будет от 172.20.82.1 до 172.20.85.255 ас пешим для того чтобы скрипт быстрее выполнялся так как на локальной сети такая скорость таймаута и подходит но только когда циклом перебираешь меньше 10 адресов.