(PHP 5 >= 5.5.0, PHP 7, PHP 8)
socket_sendmsg — Envía un mensaje
La función socket_sendmsg() envía el mensaje descrito por
message a través del socket socket,
utilizando la llamada al sistema sendmsg().
socketUna instancia de Socket creada con socket_create(), socket_accept() o socket_create_pair().
messageUn 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().
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.
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.
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.
| 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 (|).
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. |
Devuelve el número de bytes enviados, o false si ocurre un error.
| Versión | Descripción |
|---|---|
| 8.0.0 |
socket ahora es una instancia de Socket ;
anteriormente, era un resource.
|
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