XCVII. Socket

Avertissement

Ce module est EXPERIMENTAL . Cela signifie que le comportement de ces fonctions , leurs noms et concrètement , TOUT ce qui est documenté ici peut changer dans un futur proche , SANS PREAVIS ! Soyez-en conscient , et utiliser ce module à vos risques et périls .

L ' extension socket implémente une interface bas niveau avec les fonctions de communication par socket , basées sur les sockets BSD si populaires , et fournit la possibilité de fonctionner aussi bien sous forme de client que de serveur .

Les fonctions de socket décrites ici font partie d' une extension PHP qui doit être activée lors de la compilation en utilisant l 'option --enable-sockets , avec la commande configure .

Pour une interface socket cliente plus générique , voyez fsockopen( ) et pfsockopen( ) .

Lorsque vous utilisez ces fonctions , il est important de vous rappeler que si de nombreuses fonctions ont le même nom que leur alter ego en langage C , elles ont souvent des déclarations différentes . Lisez attentivement les descriptions pour éviter des confusions .

L ' extension socket a été écrite pour fournir une interface utilisable avec les puissantes sockets fournies par BSD . Un soin particulier a été apporté pour que les fonctions soient aussi efficaces sous Unix que sous Windows32 . Presque toutes les fonctions de sockets peuvent échouer dans certaines circonstances , et émettent ainsi un message d' alerte E_WARNING décrivant l 'erreur . Parfois , cela ne se fait pas selon les souhaits du développeur . Par exemple , la fonction socket_read( ) peut tout à coup émettre un message E_WARNING car la connexion a été inopinément interrompu . Il est commun de supprimer les erreurs avec l' opérateur @ et de traiter les erreurs avec la fonction socket_last_error( ) , au niveau application . Vous pouvez appeler socket_strerror( ) avec le code d'erreur pour connaître le message d 'erreur , humainement lisible . Reportez vous à leur description pour plus de détails .

Les messages E_WARNING généré par l' extension socket sont en anglais , mais le message d'erreur s'affichera en fonction de la configuration locale ( LC_MESSAGES ) :










Cela dit , ceux qui ne sont pas familiers avec la programmation par socket peuvent toujours trouver beaucoup de documentation dans les pages de manuel Unix appropriées , et il y a une grande quantité d ' introductions en langage C sur le web , qui peuvent être facilement réutilisés , avec des adaptations mineures . UNIX Socket FAQ est un bon début .

Exemple 1 . Exemple de socket : serveur TCP / IP simple

Cet exemple montre comment créer un serveur simple . Changez les variables address et port pour vous adapter à votre configuration , et exécutez le . Vous pourrez alors vous connecter au serveur avec une commande comme ceci : telnet 192.168.1.53 10000 ( en supposant que l'adresse et le port correspondent à votre configuration ) . Tout ce que vous saisissez après cela sera envoyé au serveur , et affiché en retour . Pour vous déconnecter , tapez ' quit ' .

 
#

 
!

 
/

 
usr

 
/

 
local

 
/

 
bin

 
/

 
php

 
-q

 
 ?php

 
error_reporting

 
(

 
E_ALL)

 
;

 
/

 
*

 
Permet

 
au

 
script

 
de

 
s'ex

 
eacute;cuter

 
ind

 
eacute;finiment

 
,

 
pour

 
attendre

 
une

 
connexion

 
.

 
*

 
/

 
set_time_limit

 
(0)

 
;

 
/

 
*

 
Active

 
explicitement

 
l'envoi

 
automatique

 
aux

 
visiteurs

 
*

 
au

 
fur

 
et

 
agrave

 
;

 
mesure

 
que

 
nous

 
recevons

 
les

 
donn

 
eacute;es

 
*

 
/

 
ob_implicit_flush

 
()

 
;

 
$address

 
=

 
'192.168.1.53'

 
;

 
$port

 
=

 
10000

 
;

 
if

 
(($sock

 
=

 
socket_create

 
(AF_INET

 
,

 
SOCK_STREAM

 
,

 
0)

 
)

 
0

 
)

 
{

 
echo

 
"socket_create(

 
)

 
failed

 
:

 
reason

 
:

 
"

 
.

 
socket_strerror

 
($sock

 
)

 
.

 
"\n"

 
;

 
}

 
if

 
(($ret

 
=

 
socket_bind

 
($sock

 
,

 
$address

 
,

 
$port)

 
)

 
0

 
)

 
{

 
echo

 
"socket_bind(

 
)

 
a

 
eacute;chou

 
eacute

 
;

 
:

 
raison

 
:

 
"

 
.

 
socket_strerror

 
($ret

 
)

 
.

 
"\n"

 
;

 
}

 
if

 
(($ret

 
=

 
socket_listen

 
($sock

 
,

 
5)

 
)

 
0

 
)

 
{

 
echo

 
"socket_listen(

 
)

 
a

 
eacute;chou

 
eacute

 
;

 
:

 
raison

 
:

 
"

 
.

 
socket_strerror

 
($ret

 
)

 
.

 
"\n"

 
;

 
}

 
do

 
{

 
if

 
(($msgsock

 
=

 
socket_accept($sock)

 
)

 
0

 
)

 
{

 
echo

 
"socket_accept(

 
)

 
a

 
eacute;chou

 
eacute

 
;

 
:

 
raison

 
:

 
"

 
.

 
socket_strerror

 
($msgsock

 
)

 
.

 
"\n"

 
;

 
break

 
;

 
    }

 
/

 
*

 
Envoie

 
des

 
instructions

 
.

 
*

 
/

 
$msg

 
=

 
"\nBienvenue

 
au

 
serveur

 
de

 
test

 
PHP

 
.

 
\n

 
"

 
.

 
"Pour

 
quitter

 
,

 
tapez

 
'quit

 
'

 
.




 
Pour

 
eacute;

 
teindre

 
le

 
serveur

 
,

 
tapes

 
'shutdown'.\n"

 
;

 
socket_write($msgsock

 
,

 
$msg

 
,

 
strlen($msg))

 
;

 
do

 
{

 
if

 
(FALSE

 
===

 
($buf

 
=

 
socket_read

 
($msgsock

 
,

 
2048))

 
)

 
{

 
echo

 
"socket_read(

 
)

 
a

 
eacute;chou

 
eacute

 
;

 
:

 
raison

 
:

 
"

 
.

 
socket_strerror

 
($ret

 
)

 
.

 
"\n"

 
;

 
break

 
2

 
;

 
        }

 
if

 
(!$buf

 
=

 
trim

 
($buf)

 
)

 
{

 
continue

 
;

 
        }

 
if

 
($buf

 
==

 
'quit'

 
)

 
{

 
break

 
;

 
        }

 
if

 
($buf

 
==

 
'shutdown'

 
)

 
{

 
socket_close

 
($msgsock)

 
;

 
break

 
2

 
;

 
        }

 
$talkback

 
=

 
"PHP

 
:




 
Vous

 
avez

 
dit

 
'

 
$buf'.\n"

 
;

 
socket_write

 
($msgsock

 
,

 
$talkback

 
,

 
strlen

 
($talkback))

 
;

 
echo

 
"$buf\n"

 
;

 
}

 
while

 
(true)

 
;

 
socket_close

 
($msgsock)

 
;

 
}

 
while

 
(true)

 
;

 
socket_close

 
($sock)

 
;

 
?





Exemple 2 . Exemple avec les sockets : Client TCP / IP simple

Ce exemple illustre un client HTTP simple . Il se connecte simplement à une page , envoie une requête HEAD , affiche le résultat , et se termine .

 
?php

 
error_reporting

 
(

 
E_ALL)

 
;

 
echo

 
"

 
h2

 
Connexion

 
TCP

 
/

 
IP

 
/

 
h2

 
\n"

 
;

 
/

 
*

 
Lit

 
le

 
port

 
du

 
service

 
WWW

 
.

 
*

 
/

 
$service_port

 
=

 
getservbyname

 
('www'

 
,

 
'tcp')

 
;

 
/

 
*

 
Lit

 
l'adresse

 
IP

 
du

 
serveur

 
de

 
destination

 
*

 
/

 
$address

 
=

 
gethostbyname

 
('www.exemple.com')

 
;

 
/

 
*

 
Cree

 
une

 
socket

 
TCP

 
/

 
IP

 
.

 
*

 
/

 
$socket

 
=

 
socket_create

 
(AF_INET

 
,

 
SOCK_STREAM

 
,

 
0)

 
;

 
if

 
($socket

 
0

 
)

 
{

 
echo

 
"socket_create(

 
)

 
a

 
eacute;chou

 
eacute

 
;

 
:

 
raison

 
:

 
"

 
.

 
socket_strerror

 
($socket

 
)

 
.

 
"\n"

 
;

 
}

 
else

 
{

 
echo

 
"OK.\n"

 
;

 
}

 
echo

 
"Essai

 
de

 
connexion

 
agrave

 
;

 
'$address

 
'

 
sur

 
le

 
port

 
'$service_port'..

 
."

 
;

 
$result

 
=

 
socket_connect

 
($socket

 
,

 
$address

 
,

 
$service_port)

 
;

 
if

 
($result

 
0

 
)

 
{

 
echo

 
"socket_connect(

 
)

 
a

 
eacute;chou

 
eacute

 
;

 
:

 
raison

 
:

 
($result

 
)

 
"

 
.

 
socket_strerror($result

 
)

 
.

 
"\n"

 
;

 
}

 
else

 
{

 
echo

 
"OK.\n"

 
;

 
}

 
$in

 
=

 
"HEAD

 
/

 
HTTP

 
/

 
1.0\r\n\r\n"

 
;

 
$out

 
=

 
''

 
;

 
echo

 
"Envoi

 
de

 
la

 
requ

 
ecirc;te

 
HTTP

 
HEAD..

 
."

 
;

 
socket_write

 
($socket

 
,

 
$in

 
,

 
strlen

 
($in))

 
;

 
echo

 
"OK.\n"

 
;

 
echo

 
"Lire

 
la

 
r

 
eacute;ponse

 
:

 
\n\n"

 
;

 
while

 
($out

 
=

 
socket_read

 
($socket

 
,

 
2048)

 
)

 
{

 
echo

 
$out

 
;

 
}

 
echo

 
"Fermeture

 
de

 
la

 
socket..

 
."

 
;

 
socket_close

 
($socket)

 
;

 
echo

 
"OK.\n\n"

 
;

 
?





Table des matières
socket_accept -- Accepte une connexion sur une socket
socket_bind -- Lie un nom à une socket
socket_clear_error -- Efface toutes les erreurs précédemment générées par une socket
socket_close -- Ferme une socket
socket_connect -- Crée une connexion sur une socket
socket_create_listen -- Ouvre une socket sur un port pour accepter les connexions
socket_create_pair -- Crée une paire de socket identiques et les stocke dans fds.
socket_create -- Crée une socket (point de communication)
socket_get_option -- Lit les options de socket
socket_getpeername -- Interroge l'autre extrémité de la communication
socket_getsockname -- Interroge la socket locale
socket_iovec_add -- Ajoute un nouveau vecteur dans le tableau
socket_iovec_alloc -- Construit un 'struct iovec'
socket_iovec_delete -- Efface un vecteur
socket_iovec_fetch -- Lit les données du vecteur specifié par iovec_id[iovec_position]
socket_iovec_free -- Détruit le vecteur iovec specifié par iovec_id
socket_iovec_set -- Modifie les données du vecteur iovec_id[iovec_position]
socket_last_error -- Lit la dernière erreur générée par une socket
socket_listen -- Attend une connexion (listen) sur une socket
socket_read -- Lit des données d'une socket
socket_readv -- Lit des données dans un fd, en utilisant le tableau scatter-gather définit par iovec_id
socket_recv -- Reçoit des données d'une socket connectée
socket_recvfrom -- Reçoit des données d'une socket, connectée ou pas
socket_recvmsg -- Reçoit des messages sur uen socket, qu'elle soit orientée connexion ou pas
socket_select -- Exécute l'appel système select() un tableau de socket avec une durée d'expiration
socket_send -- Envoie des données à une socket connectée
socket_sendmsg -- Envoie un message à une socket, qu'elle soit orientée connexion ou pas
socket_sendto -- Envoie une message à une socket, qu'elle soit connectée ou pas
socket_set_nonblock -- Sélectionne le mode non bloquant d'un descripteur de fichier
socket_set_option -- Modifie les options de socket
socket_shutdown -- Eteind une socket en lecture et/ou écriture
socket_strerror -- Retourne une chaîne décrivant un message d'erreur
socket_write -- Ecrit dans une socket
socket_writev -- Ecrit des données dans un descripteur de fichier, fd, en utilisant le tableau scatter-gather définie par iovec_id