Saltar al contenido

¿Cómo puedo hacer ping a un puerto de servidor con PHP?

El paso a paso o código que hallarás en este post es la resolución más fácil y válida que encontramos a esta inquietud o problema.

Solución:

Creo que la respuesta a esta pregunta resume bastante bien el problema con su pregunta.

Si lo que quiere hacer es averiguar si un determinado host aceptará conexiones TCP en el puerto 80, puede hacer esto:

$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);

Para cualquier otra cosa que no sea TCP, será más difícil (aunque dado que especifica 80, supongo que está buscando un servidor HTTP activo, por lo que TCP es lo que desea). TCP está secuenciado y reconocido, por lo que implícitamente recibirá un paquete devuelto cuando se realice una conexión con éxito. La mayoría de los demás protocolos de transporte (comúnmente UDP, pero también otros) no se comportan de esta manera, y los datagramas no se reconocerán a menos que el protocolo de capa de aplicación superpuesto lo implemente.

El hecho de que haga esta pregunta de esta manera me dice que tiene una brecha fundamental en su conocimiento sobre los protocolos de la capa de transporte. Debería leer sobre ICMP y TCP, así como sobre el modelo OSI.

Además, aquí hay una versión un poco más limpia para hacer ping a los hosts.

// 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;

En caso de que el OP realmente quisiera un ICMP-Ping, hay algunas propuestas dentro de las Notas Contribuidas por el Usuario para socket_create() [link], que utilizan sockets sin formato. Tenga en cuenta que en sistemas similares a UNIX se requiere acceso raíz.

Actualización: tenga en cuenta que el usec argumento no tiene ninguna función en Windows. El tiempo de espera mínimo es de 1 segundo.

En cualquier caso, este es el código de la función de ping más votada:

function ping($host, $timeout = 1) 
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "x08x00x7dx4bx00x00x00x00PingHost";
    $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;

Prueba esto :

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *