socket_sendmsg

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

socket_sendmsgEnvoie un message

Description

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

La fonction socket_sendmsg() envoie le message décrit par message via le socket socket, en utilisant l'appel système sendmsg().

Liste de paramètres

socket

Une instance de Socket créée avec socket_create(), socket_accept() ou socket_create_pair().

message

Un tableau associatif qui peut contenir les éléments suivants. Tous sont optionnels, et les clés non reconnues sont ignorées silencieusement. En particulier, il n'y a pas d'élément flags lors de l'envoi ; cette clé n'apparaît que dans le tableau rempli par socket_recvmsg().

name

L'adresse de l'hôte distant, sous forme de tableau. Ses clés sont addr et port pour AF_INET ; addr, port, flowinfo et scope_id pour AF_INET6 ; et path pour AF_UNIX. addr accepte une adresse IP ou un nom d'hôte, qui est alors résolu. Une clé optionnelle family sélectionne explicitement la famille d'adresses ; si elle est omise, la famille de socket est utilisée. Une famille que le socket ne prend pas en charge fait échouer l'appel.

iov

Une liste de tampons contenant les données à envoyer, qui sont envoyées dans l'ordre sous la forme d'un message unique. Les clés du tableau sont ignorées et les valeurs sont converties en chaîne de caractères. Lorsque cette clé est absente ou vide, aucune donnée n'est envoyée et la fonction retourne 0.

control

Une liste de messages de données auxiliaires. Chacun est un tableau avec les clés level, type et data. Seuls les couples ci-dessous sont pris en charge, et leur disponibilité dépend de la plateforme.

Données auxiliaires prises en charge
level type data
SOL_SOCKET SCM_RIGHTS Une liste non vide d'instances de Socket ou de ressources de flux, dont les descripteurs de fichier sont envoyés au processus destinataire.
SOL_SOCKET SCM_CREDENTIALS Un tableau avec les clés pid, uid et gid. Nommé SCM_CREDS ou SCM_CREDS2 sur certains systèmes.
IPPROTO_IPV6 IPV6_PKTINFO Un tableau avec les clés addr et ifindex.
IPPROTO_IPV6 IPV6_HOPLIMIT Un int.
IPPROTO_IPV6 IPV6_TCLASS Un int.
flags

La valeur de flags peut être n'importe quelle combinaison des drapeaux suivants, réunis par l'opérateur binaire OU (|).

Valeurs possibles pour flags
MSG_OOB Envoie les données OOB (out-of-band).
MSG_EOR Indique un marqueur d'enregistrement. Les données envoyées complètent l'enregistrement.
MSG_DONTWAIT Lorsque ce drapeau est défini, la fonction retourne même si elle devrait rester bloquée.
MSG_DONTROUTE Ignore le routage, utilise une interface directe.

Valeurs de retour

Retourne le nombre d'octets envoyés, ou false si une erreur survient.

Historique

Version Description
8.0.0 socket est désormais une instance de Socket ; auparavant, c'était une resource.

Exemples

Exemple #1 Envoi d'un message avec 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 "envoyé : $sent\n";

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

L'exemple ci-dessus va afficher :

envoyé : 11
reçu : Hello world

Exemple #2 Transmission d'un descripteur de fichier via un socket UNIX

La clé control transporte les données auxiliaires. Avec SCM_RIGHTS, elle transfère des descripteurs de fichier ouverts au processus situé à l'autre extrémité d'un socket UNIX. Ceci n'est pas disponible sous Windows.

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

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

socket_sendmsg($sender, [
    // Au moins un octet de données normales doit accompagner les données auxiliaires.
    '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 "première ligne : ", fgets($received);
?>

L'exemple ci-dessus va afficher :

première ligne : <?php

Voir aussi

add a note

User Contributed Notes

There are no user contributed notes for this page.