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> </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 [12013 просмотров]