Intereting Posts
PHP – Сериализовать плавающие точки Каков наилучший способ уменьшить количество запросов, когда у класса DAO есть методы, которые используют один и тот же результат? Почему хелперы Form и HTML устарели в Laravel 5.x Использование JavaScript для доступа к массиву JSON из PHP Рекомендации по переводу приложения на арабский Хранение файлов cookie Laravel превышает каждый раз каждые несколько посещений Можно ли добавить субдомен к Route53 с помощью SDK для PHP AWS? Как вставить несколько значений переключателей с помощью PHP OOP Объединение строк в виде массива из другой таблицы для каждой строки Каков наилучший метод для устранения эффекта Magento с использованием 20 000+ продуктов Загрузка нескольких файлов в один HTTP-запрос Загружать только XPath-поиск в память XMLReader? Имя базы данных & пользователь & пароль & хозяин на heroku PHP shell_exec () и sudo: должен быть установленным root Symfony на виртуальном хосте (проблема с корневым документом)

Как я могу ping порт сервера с PHP?

Мне нужен PHP-скрипт, который позволяет вам пинговать IP-адрес и номер порта ( ip:port ). Я нашел похожий скрипт, но он работает только для веб-сайтов, а не для ip:port .

 <?php function ping($host, $port, $timeout) { $tB = microtime(true); $fP = fSockOpen($host, $port, $errno, $errstr, $timeout); if (!$fP) { return "down"; } $tA = microtime(true); return round((($tA - $tB) * 1000), 0)." ms"; } //Echoing it will display the ping if the host is up, if not it'll say "down". echo ping("www.google.com", 80, 10); ?> 

Я хочу это для игрового сервера.

Идея состоит в том, что я могу ввести IP-адрес и номер порта, и я получаю ответ ping.

Я думаю, что ответ на этот вопрос в значительной степени подводит итог проблеме с вашим вопросом.

Если вы хотите узнать, будет ли данный хост принимать TCP-соединения на порту 80, вы можете сделать это:

 $host = '193.33.186.70'; $port = 80; $waitTimeoutInSeconds = 1; if($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)){ // It worked } else { // It didn't work } fclose($fp); 

Для чего угодно, кроме TCP, будет сложнее (хотя, поскольку вы указываете 80, я думаю, вы ищете активный HTTP-сервер, поэтому TCP – это то, что вы хотите). TCP упорядочен и подтвержден, поэтому вы будете неявно получать возвращенный пакет, когда соединение будет успешно выполнено. Большинство других транспортных протоколов (как правило, UDP, но и другие) не ведут себя таким образом, и датаграммы не будут подтверждаться, если наложенный протокол Application Layer не реализует его.

Тот факт, что вы задаете этот вопрос таким образом, говорит мне, что у вас есть фундаментальный пробел в ваших знаниях в протоколах транспортного уровня . Вы должны прочитать ICMP и TCP , а также модель OSI .

Кроме того, вот немного более чистая версия для ping для хостов.

 // Function to check response time function pingDomain($domain){ $starttime = microtime(true); $file = fsockopen ($domain, 80, $errno, $errstr, 10); $stoptime = microtime(true); $status = 0; if (!$file) $status = -1; // Site is down else { fclose($file); $status = ($stoptime - $starttime) * 1000; $status = floor($status); } return $status; } 

В случае, если OP действительно хочет ICMP-Ping, есть некоторые предложения в пользовательских примечаниях к socket_create() [link] , которые используют сырые сокеты. Имейте в виду, что в UNIX-подобных системах необходим root-доступ.

Обновление: обратите внимание, что аргумент usec не имеет функции в окнах. Минимальный тайм-аут составляет 1 секунду.

В любом случае, это код верхней проголосовавшей функции ping:

 function ping($host, $timeout = 1) { /* ICMP ping packet with a pre-calculated checksum */ $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost"; $socket = socket_create(AF_INET, SOCK_RAW, 1); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); socket_connect($socket, $host, null); $ts = microtime(true); socket_send($socket, $package, strLen($package), 0); if (socket_read($socket, 255)) { $result = microtime(true) - $ts; } else { $result = false; } socket_close($socket); return $result; } 

Попробуй это :

 echo exec('ping -n 1 -w 1 72.10.169.28'); 

Для этого вам не нужны хакеры exec или shell_exec, это можно сделать в PHP. Книга «Вы хотите сделать ЧТО с PHP?» шоу Кевина Шредера.

Он использует сокеты и функцию pack() которая позволяет читать и записывать бинарные протоколы. Что вам нужно сделать, так это создать пакет ICMP, который вы можете сделать, используя формат CCnnnA * для создания вашего пакета.

Проверить различные порты:

 $wait = 1; // wait Timeout In Seconds $host = 'example.com'; $ports = [ 'http' => 80, 'https' => 443, 'ftp' => 21, ]; foreach ($ports as $key => $port) { $fp = @fsockopen($host, $port, $errCode, $errStr, $wait); echo "Ping $host:$port ($key) ==> "; if ($fp) { echo 'SUCCESS'; fclose($fp); } else { echo "ERROR: $errCode - $errStr"; } echo PHP_EOL; } // Ping example.com:80 (http) ==> SUCCESS // Ping example.com:443 (https) ==> SUCCESS // Ping example.com:21 (ftp) ==> ERROR: 110 - Connection timed out 
 function ping($ip){ $output = shell_exec("ping $ip"); var_dump($output); } ping('127.0.0.1'); 

socket_create должен запускаться как root в системе UNIX;

 $socket = socket_create(AF_UNIX, SOCK_STREAM, 0); 

Если вы хотите отправить ICMP-пакеты в php, вы можете взглянуть на эту реализацию Ping для PHP-протокола Native-PHP , но я ее не тестировал.

Вы можете использовать функцию exec

  exec("ping ".$ip); 

здесь пример