Перебор портов и вывод свободного - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в этой теме

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

#1 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 620
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 30 Апрель 2019 - 20:50

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

	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 нужен?
0

#2 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 454
  • Регистрация: 20-Март 09
  • Репутация: 2 553
  • IPB version:3.1.x
 

Отправлено 30 Апрель 2019 - 23:45

Нет, 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;
	}

0

#3 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 620
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 02 Май 2019 - 01: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 (02 Май 2019 - 01:56)

0

#4 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 454
  • Регистрация: 20-Март 09
  • Репутация: 2 553
  • IPB version:3.1.x
 

Отправлено 04 Май 2019 - 11:32

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

#5 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 620
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 12 Май 2019 - 01:13

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

http://prntscr.com/nndkgm

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

Сообщение изменено: TemKa_SD (12 Май 2019 - 01:14)

0

Сообщить об этой теме:


Страница 1 из 1
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в этой теме

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2019 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна