(PHP 4, PHP 5, PHP 7)
fsockopen — Abre una conexión vía sockets a Internet o a un dominio Unix
$hostname
[, int $port
= -1
[, int &$errno
[, string &$errstr
[, float $timeout
= ini_get("default_socket_timeout")
]]]] ) : resource
Inicia una conexión vía sockets al recurso especificado por
hostname
.
PHP soporta objetivos Internet y dominios Unix tal y como se describe en Lista de Transportes de Sockets Soportados. También se puede obtener una lista de los transportes soportados utilizando stream_get_transports().
El socket será abierto por defecto en modo de bloqueo. Es posible cambiarlo a modo de no bloqueo utilizando stream_set_blocking().
La función stream_socket_client() es similar, pero provee un conjunto más amplio de opciones, incluyendo conexión no bloqueante y la posibilidad de proporcionar contexto a una secuencia.
hostname
Si el soporte a OpenSSL está
instalado, puedes añadir al principio del hostname
tanto ssl:// como tls:// para
utilizar una conexión de cliente SSL o TLS sobre TCP/IP para conectar al
host remoto.
port
El número de puerto. Se puede omitir con -1 para transportes que no empleen puertos, como unix://.
errno
Si se proporciona, contiene el número de error a nivel de sistema que se ha producido en la llamada a connect() a nivel de sistema.
Si el valor devuelto en errno
es
0 y la función devuelve FALSE
, esto
indica que el error ocurrió antes de
la llamada a connect(). Probablemente se deba a un
problema al inicializar el socket.
errstr
El mensaje de error como string.
timeout
El tiempo límite de la conexión, en segundos.
Nota:
Si fuera necesario definir un tiempo de límite para leer/escribir datos a través del socket, se deberá utilizar stream_set_timeout(), ya que el parámetro
timeout
de fsockopen() sólo se aplica al realizar la conexión del socket.
fsockopen() devuelve un puntero a fichero que puede ser utilizado
junto a otras funciones de fichero (como
fgets(), fgetss(),
fwrite(), fclose(), y
feof()). Si la llamada falla, devolverá FALSE
Lanza E_WARNING
si el hostname
no es
un dominio válido.
Ejemplo #1 Ejemplo de fsockopen()
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
Ejemplo #2 Utilización de una conexión UDP
El ejemplo inferior muestra cómo obtener el día y la hora del servicio UDP "daytime" (puerto 13) en el servidor local.
<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>
Nota:
Dependiendo del entorno, el dominio Unix o el tiempo de expiración opcional pueden no estar disponibles.
Los sockets UDP pueden en ocasiones aparecerán como abiertos sin errores, incluso aunque el servidor remoto no esté disponible. El error sólo aparecerá una vez se lean o escriban datos del/al socket. Esto es debido a que UDP es un protoclo "sin conexión", lo que significa que el sistema operativo no trata de establecer un enlace con el socket hasta que realmente necesita enviar o recibir datos.
Nota: Cuando se especifique una dirección numérica IPv6 (por ej., fe80::1), la IP debe ser encerrada entre corchetes — por ejemplo, tcp://[fe80::1]:80.