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

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
wells
Сообщения: 19
Зарегистрирован: 27 сен 2004, 12:31
Откуда: Москва

Помогите чайнику! Можно-ли определить работает-ли на удалённом хосте программа использующая UDP порт?
chep
Сообщения: 5
Зарегистрирован: 16 фев 2004, 23:42
Откуда: Latvia
Контактная информация:

$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);
}
wells
Сообщения: 19
Зарегистрирован: 27 сен 2004, 12:31
Откуда: Москва

А как это на PERL'е написать?
Данный текст выдаёт ошибку: Undefined subroutine &main::fsockopen called at
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

Посмотри документацию 'perlipc'. Там всё подробно описано.
wells
Сообщения: 19
Зарегистрирован: 27 сен 2004, 12:31
Откуда: Москва

Про fsockopen там не нашёл ничего!
wells
Сообщения: 19
Зарегистрирован: 27 сен 2004, 12:31
Откуда: Москва

Попутно вопрос: как правильно в цикле прокрутить все IP адреса в некотором диапазоне. Например с 10.0.0.1 до 10.0.56.254
wells
Сообщения: 19
Зарегистрирован: 27 сен 2004, 12:31
Откуда: Москва

Слабал скрипт:

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

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;
		}
	}
}
#/////////////////////////////////////////////////////////////////////////////////
Спецы посмотрите на предмет багов!
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

Про fsockopen там не нашёл ничего! :)
Еше раз. Посмотри документацию 'perlipc'. Там всё подробно описано, как сделать TCP или UDP запрос и получить ответ. И что характерно, пример для UDP дан с циклом для проверки нескольких хостов.
А fsockopen, наверно, из PHP. :)
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

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

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

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);             
  }
}
wells
Сообщения: 19
Зарегистрирован: 27 сен 2004, 12:31
Откуда: Москва

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