socket_sendmsg

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

socket_sendmsgEnvía un mensaje

Descripción

function socket_sendmsg(Socket $socket, array $message, int $flags = 0): int|false

La función socket_sendmsg() envía el mensaje descrito por message a través del socket socket, utilizando la llamada al sistema sendmsg().

Parámetros

socket

Una instancia de Socket creada con socket_create(), socket_accept() o socket_create_pair().

message

Un array asociativo que puede contener los siguientes elementos. Todos son opcionales, y las claves no reconocidas se ignoran silenciosamente. En particular, no existe ningún elemento flags al enviar; esa clave solo aparece en el array rellenado por socket_recvmsg().

name

La dirección del host remoto, en forma de array. Sus claves son addr y port para AF_INET; addr, port, flowinfo e scope_id para AF_INET6; y path para AF_UNIX. addr acepta una dirección IP o un nombre de host, que se resuelve. Una clave opcional family selecciona explícitamente la familia de direcciones; si se omite, se utiliza la familia del socket. Una familia no compatible con el socket hace que la llamada falle.

iov

Una lista de búferes con los datos a enviar, que se envían en orden como un único mensaje. Las claves del array se ignoran y los valores se convierten a cadena. Cuando esta clave falta o está vacía, no se envían datos y la función devuelve 0.

control

Una lista de mensajes de datos auxiliares. Cada uno es un array con las claves level, type y data. Solo se admiten los pares indicados a continuación, y su disponibilidad depende de la plataforma.

Datos auxiliares admitidos
level type data
SOL_SOCKET SCM_RIGHTS Una lista no vacía de instancias de Socket o recursos de flujo, cuyos descriptores de fichero se envían al proceso receptor.
SOL_SOCKET SCM_CREDENTIALS Un array con las claves pid, uid y gid. Denominado SCM_CREDS o SCM_CREDS2 en algunos sistemas.
IPPROTO_IPV6 IPV6_PKTINFO Un array con las claves addr e ifindex.
IPPROTO_IPV6 IPV6_HOPLIMIT Un int.
IPPROTO_IPV6 IPV6_TCLASS Un int.
flags

El valor de flags puede ser cualquier combinación de los siguientes indicadores, unidos con el operador OR binario (|).

Valores posibles para flags
MSG_OOB Envía datos OOB (fuera de banda).
MSG_EOR Indica una marca de registro. Los datos enviados completan el registro.
MSG_DONTWAIT Con este indicador activo, la función devuelve el control aunque normalmente se hubiera bloqueado.
MSG_DONTROUTE Omite el enrutamiento y usa la interfaz directa.

Valores devueltos

Devuelve el número de bytes enviados, o false si ocurre un error.

Historial de cambios

Versión Descripción
8.0.0 socket ahora es una instancia de Socket ; anteriormente, era un resource.

Ejemplos

Ejemplo #1 Enviar un mensaje con socket_sendmsg()

<?php
$server = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($server, '127.0.0.1', 1053);

$client = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$sent = socket_sendmsg($client, [
    'name' => ['addr' => '127.0.0.1', 'port' => 1053],
    'iov'  => ['Hello ', 'world'],
], 0);

echo "sent: $sent\n";

socket_recvfrom($server, $buffer, 64, 0, $from, $port);
echo "received: $buffer\n";
?>

El ejemplo anterior mostrará:

sent: 11
received: Hello world

Ejemplo #2 Pasar un descriptor de fichero a través de un socket UNIX

La clave control transporta datos auxiliares. Con SCM_RIGHTS, transfiere descriptores de fichero abiertos al proceso en el otro extremo de un socket UNIX. Esto no está disponible en Windows.

<?php
socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $pair);
[$sender, $receiver] = $pair;

$file = fopen(__FILE__, 'r');

socket_sendmsg($sender, [
    // Al menos un byte de datos normales debe acompañar a los datos auxiliares.
    'iov'     => ['fd'],
    'control' => [
        ['level' => SOL_SOCKET, 'type' => SCM_RIGHTS, 'data' => [$file]],
    ],
], 0);

$message = [
    'buffer_size' => 16,
    'controllen'  => socket_cmsg_space(SOL_SOCKET, SCM_RIGHTS, 1),
];
socket_recvmsg($receiver, $message, 0);

$received = $message['control'][0]['data'][0];
echo "primera línea: ", fgets($received);
?>

El ejemplo anterior mostrará:

primera línea: <?php

Véase también

add a note

User Contributed Notes

There are no user contributed notes for this page.