Страница 1 из 1

Проверка удалённого UDP порта

Добавлено: 27 сен 2004, 12:34
wells
Помогите чайнику! Можно-ли определить работает-ли на удалённом хосте программа использующая UDP порт?

Добавлено: 03 окт 2004, 01:21
chep
$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);
}

Добавлено: 06 окт 2004, 13:14
wells
А как это на PERL'е написать?
Данный текст выдаёт ошибку: Undefined subroutine &main::fsockopen called at

Добавлено: 06 окт 2004, 13:56
chur
Посмотри документацию 'perlipc'. Там всё подробно описано.

Добавлено: 06 окт 2004, 15:03
wells
Про fsockopen там не нашёл ничего!

Добавлено: 06 окт 2004, 15:05
wells
Попутно вопрос: как правильно в цикле прокрутить все IP адреса в некотором диапазоне. Например с 10.0.0.1 до 10.0.56.254

Добавлено: 06 окт 2004, 16:07
wells
Слабал скрипт:

Код: Выделить всё

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;
		}
	}
}
#/////////////////////////////////////////////////////////////////////////////////
Спецы посмотрите на предмет багов!

Добавлено: 07 окт 2004, 10:28
chur
Про fsockopen там не нашёл ничего! :)
Еше раз. Посмотри документацию 'perlipc'. Там всё подробно описано, как сделать TCP или UDP запрос и получить ответ. И что характерно, пример для UDP дан с циклом для проверки нескольких хостов.
А fsockopen, наверно, из PHP. :)

Добавлено: 07 окт 2004, 11:03
chur
Со скриптом ты извратился, конечно, качественно. Интересно, запускать пробовал?. Ну да ладно, все когда-то начинали.

Код: Выделить всё

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);             
  }
}

Добавлено: 07 окт 2004, 11:49
wells
Да уж первый блин комом. Но работает!!!
Я уже бился с inet_aton, но unpack делал с параметром 'L'. И естественно ничего не работало.
По поводу проверки UDP порта - сделал через socket. Пишу в порт на удалённой машине, затем получаю ответ. Но как быть с таймаутом когда порт не отвечает. Ведь UDP работает без установления соединения? И скрипт повисает, когда нет ответа.