БлогNot. PHP: открыт ли порт на сервере?

PHP: открыт ли порт на сервере?

На самом деле, тема освещалась вот тут, а заметка, разве что, добавляет к результату, возвращаемому стандартной функцией fsockopen, простейшую диагностику. Кроме того, подобные скрипты уже имеются онлайн, здесь приводится исходник простого варианта такого сервиса.

Необходимый и достаточный код для проверки того, открыт ли порт на сервере, таков:

$connection = @fsockopen($host, $port, $errno, $errstr, $timeout);
             //fsockopen(хост, порт, номер ошибки, строка ошибки, задержка в сек.)
if (is_resource($connection)) {
 //открыто
}
else {
 //закрыто
}

Всё остальное в приведённом ниже коде - обработка параметров, генерация формы и детализация сообщений.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
 <meta content="text/html; charset=Windows-1251" http-equiv="content-type">
 <title>Port Availability Checker</title>
</head><body><div align="center">
<?php
function options_list() {
 $numargs = func_num_args();
 $arglist = func_get_args();
 $defval = $arglist[0];
 $str = '';
 for ($i=1; $i<$numargs; $i++) 
  $str.='<option value="'.$arglist[$i].'"'.($arglist[$i]==$defval?' selected':'').'>'.$arglist[$i]."\n";
 return $str;
}

$host = '';
if (!empty($_GET['host'])) $host = trim(htmlspecialchars($_GET['host']));
$port = 80;
if (!empty($_GET['port'])) $port = abs(intval(trim(htmlspecialchars($_GET['port']))));
$ms = 5;
if (!empty($_GET['ms'])) $ms = abs(intval(trim(htmlspecialchars($_GET['ms']))));

echo '<script type="text/javascript">
  var id,ms;
  function restore_name() {
   window.clearTimeout (id);
   document.f1.action.value="Проверка";
  }
  function counter(ms0) {
   if (ms0<0) ms=document.f1.ms.options[document.f1.ms.selectedIndex].value;
   document.f1.action.value=ms+"...";
   ms--;
   if (ms>-1) id = window.setTimeout ("counter(0)",1000);
   else restore_name();
  }
  function cleaner() {
   restore_name();
   document.f1.host.value="";
   document.f1.port.value="80";
  }
 </script>
 <form name="f1" method="get" action="'.$_SERVER['PHP_SELF'].'">
  <table border="0" cellpadding="4" cellspacing="0" width="40%">
   <tr>
    <td>Хост:</td>
    <td>
     <input type="text" name="host" maxlength="40" size="40" value="'.$host.'">
    </td>
   </tr>
   <tr>
    <td>Порт:</td>
    <td>
     <input type="text" name="port" maxlength="5" size="5" value="'.$port.'">     
    </td>
   </tr>
   <tr>
    <td>Таймаут, сек.:</td>
    <td><select name="ms" size="1">'.options_list($ms,3,5,10).'</select></td>
   </tr>
   <tr>
    <td>&nbsp;</td>
    <td>
     <input type="submit" name="action" value="Проверка" onclick="counter(-1)"> 
     <input type="button" value="Очистить" onclick="cleaner()"> 
    </td>
   </tr>
  </table>
 </form>';
if (!empty($_GET['action'])) {
 echo '<p>';
 if (!empty($port) and !empty($host)) {
  $connection = @fsockopen($host, $port, $errno, $errstr, $ms);
  if (is_resource($connection) and !empty($connection)) {
   $serv = @getservbyport($port,'tcp');
   echo $host.':'.$port.' '.(empty($serv)?'':'('.$serv.')').' открыт.';
   fclose($connection);
  }
  else echo $host.':'.$port.' не отвечает.</p><p>Сообщение об ошибке: "'.$errstr.'" (номер ошибки '.$errno.')';
 }
 else echo 'Задайте хост и порт';
 echo '</p>'."\n";
}
?>
</div></body></html>

 Воспользоваться сервисом для проверки портов онлайн

02.02.2015, 22:29 [11829 просмотров]


теги: php сервис сервер

показать комментарии (1)