Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
TemKa_SD

Перебор портов и вывод свободного

Рекомендованные сообщения

Здравствуйте. Написал вот такие функции:

 

protected function checkPort($port)
{
	$connection = @fsockopen( "212.109.217.193", $port, $errno, $errstr );

	if ( $errno != "111")
	{
		$port = $port + 1;
	}

	return $port;
}

protected function getBotPort()
{
	$lastport = \IPS\Db::i()->select( 'MAX(cfg_value)', static::$cfgTable, array('cfg_name=?', 'bot_hostport') )->first();

	if ($lastport) {
		$port = $lastport + 1;
	}
	else
	{
		$port = $port;
	}

	return $this->checkPort(6116);
}

 

В форме стандартное значение функция getBotPort().

 

Логика следующая: Выбираем порты которые уже есть в базе данных, добавляем + 1 и возвращаем результат в функцию проверки порта на свободность. Есть порт занят - сейчас я еще просто +1 добавил, но нужно сделать перебор наверно, пока не найдет свободный порт. Подскажите, с чего начать? Это же foreach нужен?

Поделиться сообщением


Ссылка на сообщение

Нет, foreach для обхода массива (или iterable объектов) а тут нужен while - выполнять цикл пока условие не будет истинное.

 

protected function checkPort($port)
{
	$connection = @fsockopen( "212.109.217.193", $port, $errno, $errstr );

	return ( $errno == "111" ) ? $port : false;
}

protected function getBotPort()
{
	$lastport = \IPS\Db::i()->select( 'MAX(cfg_value)', static::$cfgTable, array('cfg_name=?', 'bot_hostport') )->first();

	do{
		$port = $this->checkPort( $lastport++ );
	}
	while( !$port );

	return $port;
}

Поделиться сообщением


Ссылка на сообщение
05/01/19 23:34 (изменено)

Спасибки, работает )

 

Два занятых порта: http://prntscr.com/njajsn

Указываем первый: http://prntscr.com/njajww

 

Результат: http://prntscr.com/njajzm

 

Только надо добавить, чтобы поиск производился с 6112, если отсутствуют записи в БД, а если есть в БД - добавлять + 1, вдруг бот отключен и порт будет свободен, а на самом деле он уже зарезервирован.

 

protected function checkPort($port)
{
   $connection = @fsockopen( "212.109.217.193", $port, $errno, $errstr );

   return ( $errno == "111" ) ? $port : false;
}

protected function getBotPort()
{
   $lastport = \IPS\Db::i()->select( 'MAX(cfg_value)', static::$cfgTable, array('cfg_name=?', 'bot_hostport') )->first();
   $lastport = $lastport ? $lastport + 1 : 6112;

   do{
       $port = $this->checkPort( $lastport++ );
   }
   while( !$port );

   return $port;
}

 

Скажите, а зачем тут в скобках? Оно ведь и так будет работать.

 

return ( $errno == "111" ) ? $port : false;

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

Будет работать. Скобки тут для удобо-читаемости кода.

Поделиться сообщением


Ссылка на сообщение
05/11/19 23:13 (изменено)

Здравствуйте, я пару дней назад пробовал реализовать для udp порта тоже самое, но оно почему-то не работает, и вот здесь у меня пишет udp6, может это другой протокол?

 

http://prntscr.com/nndkgm

 

Т.е там всегда писало что порт свободен, не было ошибок.

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...