Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перебор диапазона ip адресов

477
04 июля 2007 года
Robinnovich
182 / / 02.12.2006
Вопрос такой как реализовать перебор в цикле всех ip адресов в заданном диапазоне?
Начальные данные
$start = "172.20.1.1";
$end = "172.20.255.255";
Например так.
Заранее благодарен.
1.9K
04 июля 2007 года
InterWen
331 / / 16.09.2006
Цитата: Robinnovich
Вопрос такой как реализовать перебор в цикле всех ip адресов в заданном диапазоне?
Начальные данные
$start = "172.20.1.1";
$end = "172.20.255.255";
Например так.
Заранее благодарен.



И в чем трабла? В организации цикла?
PHP
ip2long(string ip) / long2ip(int ip)
конвертирует в (/из) signed long int [COLOR="Gray"](хотя unsigned в ПХП и не существует ведь)[/COLOR]

477
04 июля 2007 года
Robinnovich
182 / / 02.12.2006
Да именно в организации цикла так как диапазон можно задать и такой ))
$start = "1.1.1.1";
$end = "255.255.255.255";
13
04 июля 2007 года
RussianSpy
3.0K / / 04.07.2006
Ну так и обходи их по циклу! Приводи функцией ip2long() к целому значению и обходи. В чем затруднение-то?
477
04 июля 2007 года
Robinnovich
182 / / 02.12.2006
Да действительно без проблем таким образом перебирать. ))
Вот еще заминка в чем нужно проверить есть ли фтп сервер на этом ип адресе. Быстро перебрать диапазон ип и проварить на наличие фтп не получается.
Пребывал 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;
}

2
 
Код:
function url_exists($url){
    $fp = @fsockopen($url, 21);
    if($fp === false) return false;
    return true;
}

И в обоих случаях когда цикл натыкается на ип на котором нету фтп сервера
Сервак виснет.
Может есть другие способы проверить наличие фтп на компе с определенным ип.
Есть идея но не знаю как реализовать проверить только наличие открытого порта 21.
Ваши идеи&#8230;
13
04 июля 2007 года
RussianSpy
3.0K / / 04.07.2006
попробуй сокеты...
хотя я лично никогда проверку на наличие открытых портов через сокеты не писал и потому ничего конкретного сказать не могу... посмотрим что скажут эксперты форума
1.9K
04 июля 2007 года
InterWen
331 / / 16.09.2006
Кажись у fsockopen ф-ии есть еще пара-тройка необязательных параметров, последний из которых - timeout. Попробуй "поиграть" с ним (давно подобным не занимался, а проверить щас негде). Если на 21 порту "другого конца провода" сидит не законченный тормоз, то ИМХО хватит и минимального значения 1-4 (что там по умолчанию - не помню, но вроде несколько больше), либо глянь на инфу по ф-ии socket_set_timeout.
477
04 июля 2007 года
Robinnovich
182 / / 02.12.2006
1-4 все равно таймаута много так как на каждом он будет дуплить даже 1 секунду а таких например с 255 ип адресов будет даже 100 то это займет 100 сек. (( много.
Но в 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;
1.9K
04 июля 2007 года
InterWen
331 / / 16.09.2006
А куда спешим? :)
(З.Ы. ИМХО таймаута 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]
477
04 июля 2007 года
Robinnovich
182 / / 02.12.2006
Это впринцепе все равно для локалки если быть точным то диапазон будет от 172.20.82.1 до 172.20.85.255 ас пешим для того чтобы скрипт быстрее выполнялся так как на локальной сети такая скорость таймаута и подходит но только когда циклом перебираешь меньше 10 адресов.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог