(PHP 5 >= 5.5.0, PHP 7, PHP 8)
socket_sendmsg — Envoie un message
La fonction socket_sendmsg() envoie le message décrit par
message via le socket socket,
en utilisant l'appel système sendmsg().
socketUne instance de Socket créée avec socket_create(), socket_accept() ou socket_create_pair().
messageUn 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().
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.
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.
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.
| 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
(|).
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. |
Retourne le nombre d'octets envoyés, ou false si une erreur survient.
| Version | Description |
|---|---|
| 8.0.0 |
socket est désormais une instance de Socket ;
auparavant, c'était une resource.
|
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