socket_create_listen
<<<
socket_create_pair socket_create
>>>

8.114 Sockets
8 Référence des fonctions
 Manuel PHP

Introduction
Pré-requis
Installation
Configuration à l'exécution
Types de ressources
Constantes pré-définies
Erreurs de socket
Exemples
socket_accept
socket_bind
socket_clear_error
socket_close
socket_connect
socket_create_listen
->socket_create_pair
socket_create
socket_get_option
socket_getpeername
socket_getsockname
socket_last_error
socket_listen
socket_read
socket_recv
socket_recvfrom
socket_select
socket_send
socket_sendto
socket_set_block
socket_set_nonblock
socket_set_option
socket_shutdown
socket_strerror
socket_write

8.114.15 socket_create_pair()Crée une paire de sockets identiques et les stocke dans un tableau

[ Exemples avec socket_create_pair ]   PHP 4 >= 4.1.0, PHP 5

bool  socket_create_pair ( int   domain , int   type , int   protocol , array   fd )
Attention

Cette fonction est EXPERIMENTALE . Cela signifie que le comportement de cette fonction, son nom et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.

socket_create_pair crée une paire de sockets identiques et les stockent dans &fd . Cette fonction est utilisée couramment dans IPC ( InterProcess Communication ).

Le paramètre domain spécifie la famille du protocole à utiliser par le socket.

Domaine Description
AF_INET Protocole IPv4. TCP et UDP sont les protocoles communs de cette famille. Supporté uniquement Windows.
AF_INET6 Protocole IPv6. TCP et UDP sont les protocoles communs de cette famille. Le support a été ajouté en PHP 5.0.0. Supporté uniquement sous Windows.
AF_UNIX Protocole de communication locale. Le rendement élevé et des moindres coûts supplémentaires lui font une grande force d'IPC ( Interprocess Communication ).

Le paramètre type spécifie le type de communication à utiliser par la socket.

Type Description
SOCK_STREAM Fournit des flux d'octets ordonnancés, fiables, full-duplex, raccordés sur la base. Un mécanisme de transmission des données " out-of-band " peut être supporté. Le protocole TCP est basé sur ce type de socket.
SOCK_DGRAM Support des datagrammes (moins de connexion, message non garantie d'une longueur maximum fixe). Le protocole UDP est basé sur ce type de socket.
SOCK_SEQPACKET Fournis un chemin de transmission de données séquentiel, fiable, connexion à la basé par deux chemins pour les datagrammes de longueur maximal fixe ; un consommateur est requit pour lire la totalité d'un paquet avec chaque appel à la lecture.
SOCK_RAW Fournit l'accès brut de protocole de réseau. Ce type spécial de socket peut être utilisé pour construire manuellement tout type de protocole. Une utilisation commune de ce type de socket est le traitement des requêtes ICMP (comme le ping, traceroute, etc.).
SOCK_RDM Fournit une couche fiable de datagramme qui ne garantie pas l'ordre des données. Ce type de socket est le plus susceptible de ne pas être implémenté sur votre système d'exploitation.

Le paramètre protocol définie un protocole spécifique dans le domaine spécifié domain pour être utilisé lors d'une communication sur une socket retournée. La valeur appropriée peut être retrouvée par son nom en utilisant la fonction getprotobyname . Si le protocole désiré est TCP ou UDP, les constantes correspondantes SOL_TCP et SOL_UDP peuvent être utilisées.

Nom Description
icmp Le protocole ICMP ( Internet Control Message Protocol ) est utilisé tout d'abord par les passerelles et les hôtes pour reporter les erreurs dans des communications de datagramme. La commande " ping " (présente dans les systèmes de production modernes) est un exemple d'application utilisant le protocole ICMP.
udp Le protocole UDP ( User Datagramm Protocol ) est un protocole sans connexion, incertaine avec les longueurs d'enregistrement fixes. De ce fait, UDP requiert une quantité minimum de protocole.
tcp Le protocole TCP ( Transmission Control Protocol ) est un protocole fiable, connecté sur la base, orienté flux et full-duplex. TCP garantie que chaque paquet est reçu dans l'ordre dans lequel il a été envoyé. Si quelques paquets sont perdus pendant la communication, TCP retransmettra ces paquets tant que l'hôte destinataire ne les aura pas reçu entièrement. Pour des raisons de fiabilité et de performance, l'implémentation TCP lui-même décide des frontières appropriées d'octets de la couche fondamentale de communication du datagramme. Par conséquent, les applications TCP doivent autoriser la possibilité de transmission partiel d'enregistrement.

Exemple avec socket_create_pair

<?php
$sockets
= array();
$uniqid = uniqid('');
if (
file_exists("/tmp/$uniqid.sock")) {
    die(
'La socket temporaire existe déjà.');
}
/* Création de la paire de sockets */
if (!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $sockets)) {
    echo
socket_strerror(socket_last_error());
}
/* Envoi et réception de données */
if (!socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n"))) {
    echo
socket_strerror(socket_last_error());
}
if (!
$data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) {
    echo
socket_strerror(socket_last_error());
}
var_dump($data);

/* Fermeture des sockets */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>

Exemple IPC avec socket_create_pair

<?php
$ary
= array();
$strone = 'Message From Parent.';
$strtwo = 'Message From Child.';
if (!
socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary)) {
    echo
socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if (
$pid == -1) {
    echo
'Impossible de dupliquer le processus.';
} elseif (
$pid) {
    
/* parent */
    
socket_close($ary[0]);
    if (!
socket_write($ary[1], $strone, strlen($strone))) {
        echo
socket_strerror(socket_last_error());
    }
    if (
socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
       echo
"Réception de $strtwo\n";
    }
    
socket_close($ary[1]);
} else {
    
/* fils */
    
socket_close($ary[1]);
    if (!
socket_write($ary[0], $strtwo, strlen($strtwo))) {
       echo
socket_strerror(socket_last_error());
    }
    if (
socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
       echo
"Réception de $strone\n";
    }
    
socket_close($ary[0]);
}
?>

<< socket_create_pair >>
socket_create_listen Sockets socket_create