Проверка удалённого UDP порта
Помогите чайнику! Можно-ли определить работает-ли на удалённом хосте программа использующая UDP порт?
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr
\n";
} else {
fwrite($fp,"\n");
echo fread($fp, 26);
fclose($fp);
}
if (!$fp) {
echo "ERROR: $errno - $errstr
\n";
} else {
fwrite($fp,"\n");
echo fread($fp, 26);
fclose($fp);
}
А как это на PERL'е написать?
Данный текст выдаёт ошибку: Undefined subroutine &main::fsockopen called at
Данный текст выдаёт ошибку: Undefined subroutine &main::fsockopen called at
Посмотри документацию 'perlipc'. Там всё подробно описано.
Про fsockopen там не нашёл ничего!
Попутно вопрос: как правильно в цикле прокрутить все IP адреса в некотором диапазоне. Например с 10.0.0.1 до 10.0.56.254
Слабал скрипт:
Спецы посмотрите на предмет багов!
Код: Выделить всё
use strict;
my $subnet1 = '10.0.0.1-10.0.56.254';
checkSubNet1($subnet1);
#/////////////////////////////////////////////////////////////////////////////////
sub checkSubNet1 {
my @arrSubNet = split('-', @_[0]);
my @arrStartIP = split('\.', @arrSubNet[0]);
my $startIP_A = @arrStartIP[0];
my $startIP_B = @arrStartIP[1];
my $startIP_C = @arrStartIP[2];
my $startIP_D = @arrStartIP[3];
my @arrStopIP = split('\.', @arrSubNet[1]);
my $stopIP_A = @arrStopIP[0];
my $stopIP_B = @arrStopIP[1];
my $stopIP_C = @arrStopIP[2];
my $stopIP_D = @arrStopIP[3];
for ($startIP_A; $startIP_A <= $stopIP_A; $startIP_A ++) {
#print "$startIP_A\n";
#//////////////////////////////////
for ($startIP_B; $startIP_B <= $stopIP_B; $startIP_B ++) {
#print "$startIP_B\n";
if ($stopIP_B == $startIP_B) {
$stopIP_C = @arrStopIP[2];
}
else {
$stopIP_C = 254;
}
#//////////////////////////////////
for ($startIP_C; $startIP_C <= $stopIP_C; $startIP_C ++) {
#print "$startIP_C\n";
if ($stopIP_C == $startIP_C) {
$stopIP_D = @arrStopIP[3];
}
else {
$stopIP_D = 254;
}
#//////////////////////////////////
for ($startIP_D; $startIP_D <= $stopIP_D; $startIP_D ++) {
my $host_IP = $startIP_A.'.'.$startIP_B.'.'.$startIP_C.'.'.$startIP_D;
print "$host_IP\n";
#checkHost($host_IP);
}
$startIP_D = 1;
}
$startIP_C = 1;
}
}
}
#/////////////////////////////////////////////////////////////////////////////////
Еше раз. Посмотри документацию 'perlipc'. Там всё подробно описано, как сделать TCP или UDP запрос и получить ответ. И что характерно, пример для UDP дан с циклом для проверки нескольких хостов.Про fsockopen там не нашёл ничего!![]()
А fsockopen, наверно, из PHP.

Со скриптом ты извратился, конечно, качественно. Интересно, запускать пробовал?. Ну да ладно, все когда-то начинали.
Код: Выделить всё
use strict;
use Socket;
my $subnet1 = '10.0.0.1-10.0.5.254';
checkSubNet1($subnet1);
sub checkSubNet1 {
my ($start, $stop) = split(/\-/, shift);
$start = unpack('N', inet_aton($start));
$stop = unpack('N', inet_aton($stop));
for (my $curaddr = $start; $curaddr <= $stop; $curaddr++) {
my $host_IP=inet_ntoa(pack('N', $curaddr));
print "$host_IP\n";
#checkHost($host_IP);
}
}
Да уж первый блин комом. Но работает!!!
Я уже бился с inet_aton, но unpack делал с параметром 'L'. И естественно ничего не работало.
По поводу проверки UDP порта - сделал через socket. Пишу в порт на удалённой машине, затем получаю ответ. Но как быть с таймаутом когда порт не отвечает. Ведь UDP работает без установления соединения? И скрипт повисает, когда нет ответа.
Я уже бился с inet_aton, но unpack делал с параметром 'L'. И естественно ничего не работало.
По поводу проверки UDP порта - сделал через socket. Пишу в порт на удалённой машине, затем получаю ответ. Но как быть с таймаутом когда порт не отвечает. Ведь UDP работает без установления соединения? И скрипт повисает, когда нет ответа.