6.35 Sockets
6 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
|
6.35.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
)
socket_create_pair
crée une paire de sockets identiques et les stocke
dans
&fd
. Cette fonction est utilisée couramment dans
IPC (
InterProcess Communication
).
Le paramètre
domain
spécifie la famille du protocole à utiliser par
la socket.
Domaine |
Description |
AF_INET
|
Protocole IPv4. TCP et UDP sont les protocoles communs de cette famille.
Supporté uniquement sous 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 sockets.
|
SOCK_DGRAM
|
Support des datagrammes (moins de connexion, message non garanti d'une longueur maximum fixe).
Le protocole UDP est basé sur ce type de sockets.
|
SOCK_SEQPACKET
|
Fournit un chemin de transmission de données séquentiel, fiable, connecté à la base par deux chemins pour
les datagrammes de longueur maximale fixe ; un consommateur est requis 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 sockets peut être utilisé
pour construire manuellement tout type de protocole. Une utilisation commune de ce type de sockets
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 sockets est le plus susceptible de ne pas être implémenté sur votre système d'exploitation.
|
Le paramètre
protocol
définit 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
garantit 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
,
elle-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 partielle d'enregistrements.
|
Exemple avec socket_create_pair |
<?php $sockets = array(); /* 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]); } ?>
|
|