 |
socket_create_pair (PHP 4 >= 4.1.0, PHP 5) socket_create_pair -- Crea una coppia di socket non distinguibili e li memorizza in una matrice Descrizionebool socket_create_pair ( int domain, int type, int protocol, array &fd ) Avvertimento | Questa funzione è
SPERIMENTALE. Ovvero, il comportamento di questa funzione,
il nome di questa funzione, in definitiva tutto ciò che è documentato qui
può cambiare nei futuri rilasci del PHP senza preavviso. Siete avvisati, l'uso di questa
funzione è a vostro rischio. |
La funzione socket_create_pair() crea due socket connessi ed indistinguibili e li memorizza
in &fd. Questa funzione è comunemente utilizzate per l'IPC (InterProcess Communication, comunicazione tra processi).
Il parametro domain specifica la famiglia di protocolli
da usare per il socket.
Tabella 1. Famiglie di indirizzi/protocolli disponibili Dominio | Descrizione |
---|
AF_INET |
Protocollo Internet basato su IPv4. Il TCP e l'UDP sono i protocolli
più comuni di questa famiglia. Supportati solo in Windows.
| AF_INET6 |
Protocollo Internet basato su IPv6. Il TCP e l'UDP sono i protocolli
più comuni di questa famiglia. Supportati solo in Windows.
IPv6 Internet based protocols. Supporto aggiunto in PHP 5.0.0.
| AF_UNIX |
Famiglia di protocolli per la comunicazione locale. Molto efficiente, basso overhead
permettono un buon tipo di IPC (Interprocess Communication).
|
Il parametro type seleziona il tipo di comunicazione
da utilizzare con il socket.
Tabella 2. Tipi di socket disponibili Tipo | Descrizione |
---|
SOCK_STREAM |
Fornisce una connessione sequenziale, affidabile e full-duplex. Può
essere supportato un meccanismo di trasmissione fuori-banda.
Il protocollo TCP è basato su questo tipo di socket.
| SOCK_DGRAM |
Supporta i datagrammi (privo di connessione, messaggi inaffidabili di una lunghezza massima prefissata).
Il protocollo UDP è basato su questo tipo di socket.
| SOCK_SEQPACKET |
Fornisce una trasmissione di dati sequenziale, affidabile, bi-direzionale per i
datagrammi di lunghezza massima prefissata; all'utilizzatore è richiesto di
leggere l'intero pacchetto in ogni esecuzione della funzione di lettura dal socket.
| SOCK_RAW |
Fornisce un'accesso raw al protocollo di rete. Questo tipo di socket può essere
utilizzato per costruire manualmente qualsiasi tipo di protocollo. Un comune utilizzo
di questa tipologia di socket è la realizzazione di richieste ICMP (tipo
il ping o traceroute).
| SOCK_RDM |
Fornisce un'interfaccia affidabile per i datagrammi ma non ne garantisce l'ordine.
Probabilmente questo non è implementato nel vostro sistema operativo.
|
Il parametro protocol indica
lo specifico protocollo nel domain indicato da usarsi
con il socket restituito. Il valore opportuno può essere recuperato
utilizzando getprotobyname(). Se il protocollo
desiderato è il TCP o l'UDP, si possono utilizzare le corrispondenti costanti
SOL_UDP e SOL_TCP.
Tabella 3. Protocolli comuni Nome | Descrizione |
---|
icmp |
L'Internet Control Message Protocol viene utilizzato principalmente dai gateway
e dagli host per riportare errori nelle comunicazioni con datagrammi. Il
comando "ping" (presente in quasi tutti i moderni sistemi operativi) è un esempio
dell'applicazione di ICMP.
| udp |
Lo User Datagram Protocol è un protocollo privo di connessione,
inaffidabile con record di lunghezza fissa. Per questo l'UDP
richiede poco overhead di protocollo.
| tcp |
Il Transmission Control Protocol è un procotollo affidabile, basato sulla connessione,
orientato al flusso, full duplex. Il TCP garantisce che tutti i pacchetti
siano ricevuti nel medesimo ordine in cui siano stati inviati. Se un pacchetto
viene perso durante la trasmissione, il TCP provvederà automaticamente alla ritrasmissione
fino a quando l'host remoto non conferma la ricezione dello stesso. Per ragioni
di affidabilità e di prestazioni, è il TCP stesso a decidere l'appropriata dimensione
dei pacchetti del sottostante livello di datagrammi. Pertanto le applicazioni TCP devono
permettere la parziale ritrasmissione di un record.
|
Esempio 1. Esempio di uso di socket_create_pair()
<?php $sockets = array(); $uniqid = uniqid(''); if (file_exists("/tmp/$uniqid.sock")) { die('Temporary socket already exists.'); } /* Setup socket pair */ if (!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $sockets)) { echo socket_strerror(socket_last_error()); } /* Send and Recieve Data */ 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); /* Close sockets */ socket_close($sockets[0]); socket_close($sockets[1]); ?>
|
|
Esempio 2. Esempio di IPC con 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 'Could not fork Process.'; } 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 "Recieved $strtwo\n"; } socket_close($ary[1]); } else { /*child*/ 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 "Recieved $strone\n"; } socket_close($ary[0]); } ?>
|
|
|  |