socket_get_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

socket_get_option — Lit les options du socket

Description

function socket_get_option(Socket $socket, int $level, int $option): array|int|false

socket_get_option() récupÚre la valeur de l'option spécifiée par le paramÚtre option pour le socket spécifié par le paramÚtre socket.

Liste de paramĂštres

socket

Une instance de Socket créée par socket_create() ou socket_accept().

level

Le paramĂštre level spĂ©cifie la couche de protocole de l'option. Par exemple, pour connaĂźtre les options de la couche socket, la valeur SOL_SOCKET du paramĂštre level sera utilisĂ©e. Les autres degrĂ©s, comme TCP, peuvent ĂȘtre utilisĂ©s en spĂ©cifiant le numĂ©ro du protocole de cette couche. Les numĂ©ros de protocoles peuvent ĂȘtre trouvĂ©s en utilisant la fonction getprotobyname().

option
Options disponibles pour les sockets
Option Description Type
SO_DEBUG Reporte si les informations de débogage sont enregistrées ou pas. int
SO_BROADCAST Reporte si la transmission des annonces globales est supportée ou pas. int
SO_REUSEADDR Indique si les adresses locales peuvent ĂȘtre rĂ©utilisĂ©es ou pas. int
SO_REUSEPORT Indique si les ports locaux peuvent ĂȘtre rĂ©utilisĂ©s. int
SO_KEEPALIVE Reporte si les connexions sont persistantes avec des transmissions périodiques de messages ou pas. Si le socket connecté échoue en réponse à ces messages, la connexion est interrompue et le processus écrira sur ce socket une notification avec un signal SIGPIPE. int
SO_LINGER

Reporte si le socket socket s'attarde sur la fonction socket_close() si des données sont présentes ou pas. Par défaut, lorsque le socket est fermé, socket_close() tente d'envoyer toutes les données qui ne l'ont pas encore été.

Si l_onoff ne vaut pas zéro et que l_linger vaut zéro, toutes les données qui n'ont pas encore été envoyées seront annulées et RST (réinitialisation) sera envoyé dans le cas d'une connexion orientée socket.

D'un autre cÎté, si l_onoff ne vaut pas zéro et l_linger ne vaut pas zéro, socket_close() bloquera tant que les données non envoyées ne le seront pas ou pendant le temps spécifié par l_linger. Si le socket est non-bloquant, socket_close() échoue et retournera une erreur.

array. Le tableau contiendra 2 clés : l_onoff et l_linger.
SO_OOBINLINE Reporte si le socket socket laisse les données hors bande intégrées au flux normal ou pas. int
SO_SNDBUF Reporte les informations sur la taille du tampon envoyé. int
SO_RCVBUF Reporte les informations sur la taille du tampon reçu. int
SO_ERROR Reporte les informations sur le statut de l'erreur et le vide. int (ne peut ĂȘtre dĂ©fini par la fonction socket_set_option())
SO_TYPE Reporte le type du socket socket (e.g. SOCK_STREAM). int (ne peut ĂȘtre dĂ©fini par la fonction socket_set_option())
SO_DONTROUTE Reporte si les messages sortants dévient les équipements standard de cheminement. int
SO_RCVLOWAT Reporte le nombre minimal d'octets au processus pour les opérations entrantes sur le socket socket. int
SO_RCVTIMEO Reporte la valeur du délai d'exécution pour les opérations entrantes. array. Le tableau contiendra 2 clés : sec qui est la partie représentant les secondes de la valeur du délai d'attente et usec qui est la partie représentant les microsecondes.
SO_SNDTIMEO Reporte la valeur du dĂ©lai d'exĂ©cution spĂ©cifiant le temps maximal d'exĂ©cution pour les fonctions sortantes bloquantes parce que la commande d'Ă©coulement empĂȘche des donnĂ©es d'ĂȘtre envoyĂ©es. array. Le tableau contiendra 2 clĂ©s : sec qui est la partie reprĂ©sentant les secondes de la valeur du dĂ©lai d'attente et usec qui est la partie reprĂ©sentant les microsecondes.
SO_SNDLOWAT Reporte le nombre minimal d'octets au processus pour les opérations sortantes sur le socket socket. int
TCP_NODELAY Indique si l'algorithme Nagle TCP est désactivé. int
MCAST_JOIN_GROUP Joint un groupe multicast. Un tableau avec une clĂ© "group", spĂ©cifiant une chaĂźne de caractĂšres avec les adresses multicast IPv4 ou IPv6 et une clĂ© "interface", spĂ©cifiant soit un numĂ©ro d'interface (de type int), soit une chaĂźne de caractĂšres avec le nom de l'interface, comme "eth0". 0 peut ĂȘtre spĂ©cifiĂ© pour indiquer que l'interface doit ĂȘtre sĂ©lectionnĂ©e en utilisant les rĂšgles de routage (ne peut ĂȘtre utilisĂ© qu'avec la fonction socket_set_option()).
MCAST_LEAVE_GROUP Quitte un groupe multicast. Un tableau. Voir la constante MCAST_JOIN_GROUP pour plus d'informations (ne peut ĂȘtre utilisĂ© qu'avec la fonction socket_set_option()).
MCAST_BLOCK_SOURCE Bloque les paquets arrivant depuis une source spĂ©cifique vers un groupe multicast spĂ©cifique, qui aura dĂ» ĂȘtre joint auparavant. Un tableau contenant les mĂȘmes clĂ©s que celles de la constante MCAST_JOIN_GROUP, avec une clĂ© supplĂ©mentaire source, liĂ© Ă  une chaĂźne de caractĂšres spĂ©cifiant une adresse IPv4 ou IPv6 de la source Ă  bloquer (ne peut ĂȘtre utilisĂ© qu'avec la fonction socket_set_option()).
MCAST_UNBLOCK_SOURCE DĂ©bloque (recommence Ă  recevoir) les paquets arrivant depuis une source spĂ©cifique vers un groupe multicast spĂ©cifique, qui aura dĂ» ĂȘtre joint auparavant. Un tableau au mĂȘme format que celui de la constante MCAST_BLOCK_SOURCE (ne peut ĂȘtre utilisĂ© qu'avec la fonction socket_set_option()).
MCAST_JOIN_SOURCE_GROUP Reçoit des paquets destinĂ©s Ă  un groupe multicast spĂ©cifique dont l'adresse source correspond Ă  une valeur spĂ©cifique. Un tableau au mĂȘme format que celui de la constante MCAST_BLOCK_SOURCE (ne peut ĂȘtre utilisĂ© qu'avec la fonction socket_set_option()).
MCAST_LEAVE_SOURCE_GROUP ArrĂȘte de recevoir des paquets destinĂ©s Ă  un groupe multicast spĂ©cifique dont l'adresse source correspond Ă  une valeur spĂ©cifique. Un tableau au mĂȘme format que celui de la constante MCAST_BLOCK_SOURCE (ne peut ĂȘtre utilisĂ© qu'avec la fonction socket_set_option()).
IP_MULTICAST_IF L'interface de sortie pour les paquets multicast IPv4. Soit un entier spĂ©cifiant le numĂ©ro de l'interface, soit une chaĂźne de caractĂšres reprĂ©sentant le nom de l'interface, par exemple, eth0. La valeur 0 peut ĂȘtre utilisĂ© pour indiquer la table de routage Ă  utiliser dans la sĂ©lection de l'interface. La fonction socket_get_option() retourne un index d'interface. Il est Ă  noter que, contrairement Ă  l'API C, cette option ne prend pas comme argument une adresse IP. Ceci Ă©limine la diffĂ©rence d'interface entre les constantes IP_MULTICAST_IF et IPV6_MULTICAST_IF.
IPV6_MULTICAST_IF L'interface de sortie pour les paquets multicast IPv6. Identique Ă  la constante IP_MULTICAST_IF.
IP_MULTICAST_LOOP La politique de la boucle locale multicast pour les paquets IPv4 active ou désactive le bouclage des multidiffusions sortantes, qui doivent avoir été jointes auparavant. L'effet diffÚre cependant selon qu'il s'applique à Unix ou à Windows, le premier étant sur le chemin de réception tandis que le second sur le chemin d'envoi. Un entier (soit 0, soit 1). Pour la fonction socket_set_option(), n'importe quelle valeur sera acceptée et sera convertie en un booléen suivant les rÚgles habituelles de PHP.
IPV6_MULTICAST_LOOP Identique Ă  la constante IP_MULTICAST_LOOP, mais pour l'IPv6. Un entier. Voir la constante IP_MULTICAST_LOOP.
IP_MULTICAST_TTL La durĂ©e de vie des paquets sortants multicast IPv4. Ce doit ĂȘtre une valeur comprise entre 0 (ne pas quitter l'interface) et 255. Par dĂ©faut, la valeur est Ă  1 (seul le rĂ©seau local est atteint). Un entier entre 0 et 255.
IPV6_MULTICAST_HOPS Identique Ă  la constante IP_MULTICAST_TTL, mais pour les paquets IPv6. La valeur -1 est Ă©galement acceptĂ©e, signifiant que la route par dĂ©faut doit ĂȘtre utilisĂ©e. Un entier compris entre -1 et 255.
SO_MARK Définit un identifiant sur le socket pour le but de filtrer les paquets sur Linux. int
SO_ACCEPTFILTER Ajoute un filtre d'acceptation sur le socket Ă©coutĂ© (FreeBSD/NetBSD). Un module kernel de filtre d'acceptation doit d'abord ĂȘtre chargĂ© sur FreeBSD (e.g. accf_http). string nom du filtre (15 caractĂšres maximum).
SO_USER_COOKIE Définit un identifiant sur le socket pour le but de filtrer les paquets sur FreeBSD. int
SO_RTABLE Définit un identifiant sur le socket pour le but de filtrer les paquets sur OpenBSD. int
SO_DONTTRUNC Conserve les données non lues. int
SO_WANTMORE Fournit un indice quand plus de donnĂ©es sont prĂȘtes. int
TCP_DEFER_ACCEPT Ne pas notifier un socket qui Ă©coute tant que les donnĂ©es ne sont pas prĂȘtes. int
SO_INCOMING_CPU RécupÚre/Définit l'affinité du cpu pour un socket. int
SO_MEMINFO RécupÚre toutes les meminfo d'un socket. int
SO_BPF_EXTENSIONS RécupÚre les extensions BPF supportées par le kernel à attacher à un socket. int
SO_SETFIB Définit la table de route (FIB) d'un socket. (FreeBSD uniquement) int
SOL_FILTER Filtres attribués à un socket. (Solaris/Illumos uniquement) int
TCP_KEEPCNT Définit le nombre maximal de sondes keepalive TCP devrait envoyer avant de lùcher la connexion. int
TCP_KEEPIDLE Définit le temps que la connexion doit rester inactive. int
TCP_KEEPINTVL Définit le temps entre les sondes keepalive individuelles. int
TCP_KEEPALIVE Définit le temps que la connexion doit rester inactive. (macOS uniquement) int
TCP_NOTSENT_LOWAT Définit le nombre limite de données non envoyées dans la file d'attente d'écriture par le flux de socket. (Linux uniquement) int

Valeurs de retour

Retourne la valeur de l'option fournie, ou false si une erreur survient.

Historique

Version Description
8.0.0 socket est désormais une instance de Socket ; auparavant, c'était une resource.

Exemples

Exemple #1 Exemple avec socket_get_option()

<?php
$socket
= socket_create_listen(1223);

$linger = array('l_linger' => 1, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);

var_dump(socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR));
?>

Voir aussi

add a note

User Contributed Notes 4 notes

up
3
recycling dot sp dot am at gmail dot com ¶
15 years ago
Just 2 notes here:
- On UNIX, If SO_DEBUG is set, the php program needs an effective user id of 0.
-  activating SO_OOBINLINE on a socket is equivalent to passing MSG_OOB flag to each recieving functions used with that socket (eg: socket_recv, socket_recvfrom).
up
4
Chad Lavoie ¶
15 years ago
If using Unix Sockets, and you want to use SO_PEERCRED, you can use the number 17 for the optname (and SOL_SOCKET for the level).  The PID of the connecting process will be returned.
up
1
prennings at gmail dot com ¶
12 years ago
I was playing around with this option to use multiply socket connections with same hostname and same port (IRC). However the socket function needed for this is SO_REUSEPORT.

Though the majority of linux distro's does not have that yet officially implented in there distro's.

However for debian there is an patch that can be installed to get it working:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c617f398edd4db2b8567a28e899a88f8f574798d

it has some work but I got it working after a while (Noobie in debian) maybe some other people are facing the same problem as I was.
up
1
skydiablo at gmx dot net ¶
4 years ago
to receive UDP DHCP packets on a dedicated interface, you have to use the undocumented option SO_BINDTODEVICE:

<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, 'eth1');
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);

socket_bind($socket, '255.255.255.255', 67);
while (1) {
    if ($src = @socket_recv($socket, $data, 9999, 0)) {
        echo $data . PHP_EOL;
    }
}
?>