stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_clientAbrir una conexión de socket de dominio de Internet o Unix

Descripción

stream_socket_client(
    string $remote_socket,
    int &$errno = ?,
    string &$errstr = ?,
    float $timeout = ini_get("default_socket_timeout"),
    int $flags = STREAM_CLIENT_CONNECT,
    resource $context = ?
): resource

Inicia una conexión de flujo o datagrama al destino especificado por remote_socket. El tipo de socket creado se determina por el transporte especificado usando el formato de URL estándar: transporte://objetivo. Para sockets de Dominio de Internet (AF_INET) como TCP y UDP, la porción del objetivo del parámetro remote_socket debería consistir en un nombre de host o dirección IP seguida de dos puntos y un número de puerto. Para sockets de dominio de Unix, la porción de target apuntará al archivo de socket del sistema de archivos.

Nota:

El flujo será abierto por defecto en modo de bloqueo. Se puede cambiar al modo de no bloqueo usando stream_set_blocking().

Parámetros

remote_socket

Dirección del socket al que se va a conectar.

errno

Será establecido al número de error a nivel de sistema si la conexión falla.

errstr

Será establecido al mensaje de error a nivel de sistema si la conexión falla.

timeout

Número de segundos hasta que la llamda al sistema de connect() debería esperar.

Nota: Este parámetro sólo se aplica cuando no se hace un intento de conexión asíncrona.

Nota:

Para establecer un tiempo de espera para lectura/escritura de información sobre el socket, use la función stream_set_timeout(), ya que timeout sólo se aplica mientras se hace una conexión al socket.

flags

Campo de máscara de bits que puede ser establecido a cualquier combinación de banderas de conexión. Actualmente la selección de banderas de conexión está limitada a STREAM_CLIENT_CONNECT (por defecto), STREAM_CLIENT_ASYNC_CONNECT y STREAM_CLIENT_PERSISTENT.

context

Un recurso de contexto válido creado con stream_context_create().

Valores devueltos

Si se tuvo éxito, un recurso de flujo es devuelto, el cuál se puede usar junto con las demás funciones de archivo (tales como fgets(), fgetss(), fwrite(), fclose(), y feof()), false si falló.

Errores/Excepciones

Si falló, los argumentos errno y errstr serán rellenados con el error a nivel de sistema actual que ocurrió en la llamda a nivel de sistema de connect(). Si el valor devuelto en errno es 0 y la función devolvió false, es una indicación de que el error ocurrió antes de la llamada a connect(). Esto es lo más probable debido a un problema de inicialización del socket. Observe que los argumentos errno y errstr siempre serán pasados por referencia.

Ejemplos

Ejemplo #1 Ejemplo de stream_socket_client()

<?php
$fp
= stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!
$fp) {
echo
"$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!
feof($fp)) {
echo
fgets($fp, 1024);
}
fclose($fp);
}
?>

Ejemplo #2 Usar una conexión UDP

Recuperar el día y la hora desde el servicio "daytime" de UDP (puerto 13) en localhost.

<?php
$fp
= stream_socket_client("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);
}
?>

Notas

Advertencia

Los sockects UDP a veces parecerán estar abiertos sin un error, incluso si el host remoto es inalcanzable. El error sólo aparecerá cuando se lea o escriba información desde/en el socket. La razón de esto es que UDP es un protocolo no orientado a conexión, lo que significa que el sistema operativo no intenta establecer un enlace para el socket hasta que se necesite enviar o recibir informaicón.

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.

Nota:

Dependiendo del entorno, pueden no estar disponibles el dominio Unix o el tiempo de espera opcional de la conexión. Una lista de transportes disponibles se puede recuperar unsando stream_get_transports(). Véase Lista de Transportes de Sockets Soportados para una lista de transportes incluidos.

Ver también

  • stream_socket_server() - Crear un socket de servidor de dominio de Internet o de Unix
  • stream_set_blocking() - Establecer el modo bloqueo/no-bloqueo en un flujo
  • stream_set_timeout() - Establecer un perido de tiempo de espera en un flujo
  • stream_select() - Ejecuta el equivalente de la llamada al sistema select() sobre las matrices de flujos dadas con un tiempo de espera especificado por tv_sec y tv_usec
  • fgets() - Obtiene una línea desde el puntero a un fichero
  • fgetss() - Obtiene un línea desde un puntero a un archivo y elimina las etiquetas HTML
  • fwrite() - Binary-safe file write
  • fclose() - Cierra un puntero a un archivo abierto
  • feof() - Comprueba si el puntero a un archivo está al final del archivo
  • Funciones de cURL

add a note

User Contributed Notes 2 notes

up
22
nicholas at nicholaswilliams dot net
16 years ago
For those wanting to use stream_socket_client() to connect to a local UNIX socket who can't find documentation on how to do it, here's a (rough) example:

<?php

$sock
= stream_socket_client('unix:///full/path/to/my/socket.sock', $errno, $errstr);

fwrite($sock, 'SOME COMMAND'."\r\n");

echo
fread($sock, 4096)."\n";

fclose($sock);

?>
up
10
Vasil Rangelov a.k.a. boen_robot
13 years ago
The remote_socket argument, in its end (well... after the port), can also contain a "/" followed by a unique identifier. This is especially useful if you want to create multiple persistent connections to the same transport://host:port combo.

Example:
<?php
$socket
= stream_socket_client('tcp://mysql.example.com:3306/root', $errorno, $errorstr, $timeout, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
?>

Note that while (p)fsockopen() follows a similar scheme, it doesn't have this particular feature.
To Top