PHP 8.5.0 Alpha 1 available for testing

socket_get_option

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

socket_get_optionLee las opciones del socket

Descripción

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

socket_get_option() recupera el valor de la opción especificada por el argumento option para el socket especificado por el argumento socket.

Parámetros

socket

Una instancia de Socket creada por socket_create() o socket_accept().

level

El argumento level especifica la capa de protocolo de la opción. Por ejemplo, para conocer las opciones de la capa socket, el valor SOL_SOCKET del argumento level será utilizado. Otros niveles, como TCP, pueden ser utilizados especificando el número del protocolo de esta capa. Los números de protocolos pueden ser encontrados utilizando la función getprotobyname().

option
Opciones disponibles para los sockets
Opción Descripción Tipo
SO_DEBUG Reporta si las informaciones de depuración son registradas o no. int
SO_BROADCAST Reporta si la transmisión de anuncios globales es soportada o no. int
SO_REUSEADDR Indica si las direcciones locales pueden ser reutilizadas o no. int
SO_REUSEPORT Indica si los puertos locales pueden ser reutilizados. int
SO_KEEPALIVE Reporta si las conexiones son persistentes con transmisiones periódicas de mensajes o no. Si el socket conectado falla en respuesta a estos mensajes, la conexión es interrumpida y el proceso escribirá sobre este socket una notificación con un señal SIGPIPE. int
SO_LINGER

Reporta si el socket socket se demora en la función socket_close() si hay datos presentes o no. Por omisión, cuando el socket es cerrado, socket_close() intenta enviar todos los datos que no han sido enviados aún.

Si l_onoff no vale cero y que l_linger vale cero, todos los datos que no han sido enviados aún serán cancelados y RST (reinicialización) será enviado en el caso de una conexión orientada socket.

Por otro lado, si l_onoff no vale cero y l_linger no vale cero, socket_close() bloqueará hasta que los datos no enviados sean enviados o durante el tiempo especificado por l_linger. Si el socket es no-bloqueante, socket_close() fallará y retornará un error.

array. El array contendrá 2 claves : l_onoff y l_linger.
SO_OOBINLINE Reporta si el socket socket parte sobre datos en línea out-of-band o no. int
SO_SNDBUF Reporta las informaciones sobre el tamaño del buffer enviado. int
SO_RCVBUF Reporta las informaciones sobre el tamaño del buffer recibido. int
SO_ERROR Reporta las informaciones sobre el estado de error y lo vacía. int (no puede ser definido por la función socket_set_option())
SO_TYPE Reporta el tipo del socket socket (ej. SOCK_STREAM). int (no puede ser definido por la función socket_set_option())
SO_DONTROUTE Reporta si los mensajes salientes desvían los equipos estándar de encaminamiento. int
SO_RCVLOWAT Reporta el número mínimo de octetos al proceso para las operaciones entrantes sobre el socket socket. int
SO_RCVTIMEO Reporta el valor del tiempo límite para las operaciones entrantes. array. El array contendrá 2 claves : sec que es la parte representando los segundos del valor del tiempo de espera y usec que es la parte representando los microsegundos.
SO_SNDTIMEO Reporta el valor del tiempo límite especificando el tiempo máximo de ejecución para las funciones salientes bloqueantes porque el comando de flujo impide que los datos sean enviados. array. El array contendrá 2 claves : sec que es la parte representando los segundos del valor del tiempo de espera y usec que es la parte representando los microsegundos.
SO_SNDLOWAT Reporta el número mínimo de octetos al proceso para las operaciones salientes sobre el socket socket. int
TCP_NODELAY Indica si el algoritmo Nagle TCP está desactivado. int
MCAST_JOIN_GROUP Se une a un grupo multicast. Un array con una clave "group", especificando un string con las direcciones multicast IPv4 o IPv6 y una clave "interface", especificando ya sea un número de interfaz (de tipo int), ya sea un string con el nombre de la interfaz, como "eth0". 0 puede ser especificado para indicar que la interfaz debe ser seleccionada utilizando las reglas de encaminamiento (no puede ser utilizado más que con la función socket_set_option()).
MCAST_LEAVE_GROUP Abandona un grupo multicast. Un array. Ver la constante MCAST_JOIN_GROUP para más informaciones (no puede ser utilizado más que con la función socket_set_option()).
MCAST_BLOCK_SOURCE Bloquea paquetes llegando desde una fuente específica hacia un grupo multicast específico, que habrá debido ser unido anteriormente. Un array conteniendo las mismas claves que las de la constante MCAST_JOIN_GROUP, con una clave adicional source, ligado a un string especificando una dirección IPv4 o IPv6 de la fuente a bloquear (no puede ser utilizado más que con la función socket_set_option()).
MCAST_UNBLOCK_SOURCE Desbloquea (recomienza a recibir) los paquetes llegando desde una fuente específica hacia un grupo multicast específico, que habrá debido ser unido anteriormente. Un array en el mismo formato que el de la constante MCAST_BLOCK_SOURCE (no puede ser utilizado más que con la función socket_set_option()).
MCAST_JOIN_SOURCE_GROUP Recibe paquetes destinados a un grupo multicast específico cuya dirección fuente corresponde a un valor específico. Un array en el mismo formato que el de la constante MCAST_BLOCK_SOURCE (no puede ser utilizado más que con la función socket_set_option()).
MCAST_LEAVE_SOURCE_GROUP Deja de recibir paquetes destinados a un grupo multicast específico cuya dirección fuente corresponde a un valor específico. Un array en el mismo formato que el de la constante MCAST_BLOCK_SOURCE (no puede ser utilizado más que con la función socket_set_option()).
IP_MULTICAST_IF La interfaz de salida para los paquetes multicast IPv4. Ya sea un entero especificando el número de la interfaz, ya sea un string representando el nombre de la interfaz, por ejemplo, eth0. El valor 0 puede ser utilizado para indicar la tabla de encaminamiento a utilizar en la selección de la interfaz. La función socket_get_option() retorna un índice de interfaz. Note que, a diferencia de la API C, esta opción no toma como argumento una dirección IP. Esto elimina la diferencia de interfaz entre las constantes IP_MULTICAST_IF y IPV6_MULTICAST_IF.
IPV6_MULTICAST_IF La interfaz de salida para los paquetes multicast IPv6. Idéntico a la constante IP_MULTICAST_IF.
IP_MULTICAST_LOOP La política de la bucla local multicast para los paquetes IPv4 activa o desactiva el buclaje de las multidifusiones salientes, que deben haber sido unidas anteriormente. El efecto difiere sin embargo según que se aplique a Unix o a Windows, el primero siendo sobre el camino de recepción mientras que el segundo sobre el camino de envío. Un entero (ya sea 0, ya sea 1). Para la función socket_set_option(), cualquier valor será aceptado y será convertido en un booleano siguiendo las reglas habituales de PHP.
IPV6_MULTICAST_LOOP Idéntico a la constante IP_MULTICAST_LOOP, pero para el IPv6. Un entero. Ver la constante IP_MULTICAST_LOOP.
IP_MULTICAST_TTL La duración de vida de los paquetes salientes multicast IPv4. Esto debe ser un valor comprendido entre 0 (no salir de la interfaz) y 255. Por omisión, el valor es a 1 (solo la red local es alcanzada). Un entero entre 0 y 255.
IPV6_MULTICAST_HOPS Idéntico a la constante IP_MULTICAST_TTL, pero para los paquetes IPv6. El valor -1 es igualmente aceptado, significando que la ruta por omisión debe ser utilizada. Un entero comprendido entre -1 y 255.
SO_MARK Define un identificador sobre el socket para el propósito de filtrar los paquetes sobre Linux. int
SO_ACCEPTFILTER Añade un filtro de aceptación sobre el socket escuchado (FreeBSD/NetBSD). Un módulo kernel de filtro de aceptación debe ser cargado primero sobre FreeBSD (ej. accf_http). string nombre del filtro (longitud 15 max).
SO_USER_COOKIE Define un identificador sobre el socket para el propósito de filtrar los paquetes sobre FreeBSD. int
SO_RTABLE Define un identificador sobre el socket para el propósito de filtrar los paquetes sobre OpenBSD. int
SO_DONTTRUNC Conserva los datos no leídos. int
SO_WANTMORE Proporciona un índice cuando más datos están listos. int
TCP_DEFER_ACCEPT No notificar un socket que escucha hasta que los datos no estén listos. int
SO_INCOMING_CPU Recupera/Define la afinidad del cpu para un socket. int
SO_MEMINFO Recupera toda la meminfo de un socket. int
SO_BPF_EXTENSIONS Recupera las extensiones BPF soportadas por el kernel para adjuntar a un socket. int
SO_SETFIB Define la tabla de encaminamiento (FIB) de un socket. (FreeBSD solamente) int
SOL_FILTER Filtros atribuidos a un socket. (Solaris/Illumos solamente) int
TCP_KEEPCNT Define el número máximo de sondas keepalive TCP debería enviar antes de soltar la conexión. int
TCP_KEEPIDLE Define el tiempo que la conexión debe permanecer inactiva. int
TCP_KEEPINTVL Define el tiempo entre las sondas keepalive individuales. int
TCP_KEEPALIVE Define el tiempo que la conexión debe permanecer inactiva. (macOS solamente) int
TCP_NOTSENT_LOWAT Define el número límite de datos no enviados en la cola de escritura por el flujo de socket. (Linux solamente) int

Valores devueltos

Retorna el valor de la opción proporcionada, o false en caso de error.

Historial de cambios

Versión Descripción
8.0.0 socket is a Socket instance now; previously, it was a resource.

Ejemplos

Ejemplo #1 Ejemplo con 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));
?>

Ver también

add a note

User Contributed Notes 4 notes

up
3
recycling dot sp dot am at gmail dot com
14 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
14 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
11 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
3 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;
}
}
?>
To Top