socket_get_option

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

socket_get_optionObtiene las opciones de socket para el socket

Descripción

socket_get_option(resource $socket, int $level, int $optname): mixed

La función socket_get_option() recupera el valor de la opción especificada por el parámetro optname para el socket especificado.

Parámetros

socket

Un recurso socket válido creado con socket_create() o socket_accept().

level

El parámetro level especifica el nivel de protcolo en el que reside la opción. Por ejemplo, para recuperar las opciones al nivel de socket se usaría un parámetro level de SOL_SOCKET. Se puden usar otros niveles como TCP especificando el número de protocolo de ese nivel. Los números de protocolo se pueden averiguar usando la función getprotobyname().

optname
Opciones de Socket Disponibles
Opción Descripción Tipo
SO_DEBUG Informa si la información de depuración está siendo registrada. int
SO_BROADCAST Informa si la transmisión de mensajes de emisión está soportada. int
SO_REUSEADDR Informa si las direcciones locales pueden ser rechazadas. int
SO_REUSEPORT Informa si los puertos locales pueden ser reutilizados. int
SO_KEEPALIVE Informa si las conexiones se mantienen activas con transmisiones periódicas de mensajes. Si el socket conectado falla al responder a estos mensajes, la conexión es interrumpida y los procesos que escriben en ese socket son notificados con una señal SIGPIPE. int
SO_LINGER

Informa si el socket perdura en socket_close() si la información está presente. Por omisión, cuando el socket se cierra, se intenta enviar toda la información no enviada. En el caso de un socket orientado a conexión, socket_close() esperará a su par para admitir la información.

Si l_onoff no es cero y l_linger es cero, toda la información no enviada será desechada y se envía RST (reinicio) al par en el caso de un socker orientado a conexión.

Por otro lado, si l_onoff no es cero y l_linger no es cero, socket_close() bloqueará hasta que toda la información sea enviada o transcurra el tiempo especificado en l_linger. Si el socket es de no-bloqueo, socket_close() fallará y devolverá un error.

array. La matriz contendrá dos claves: l_onoff y l_linger.
SO_OOBINLINE Informa si el socket deja información fuera de banda en línea. int
SO_SNDBUF Informa del tamaño del buffer de envío. int
SO_RCVBUF Informa del tamaño del buffer de recepción. int
SO_ERROR Da información sobre el estado de error y lo limpia. int (no puede ser establecido por la función socket_set_option())
SO_TYPE Informa del tipo socket (p.ej. SOCK_STREAM). int (no puede ser establecido mediante socket_set_option())
SO_DONTROUTE Informa si los mensajes salientes se desvían de los mecanismos de ruta estándar. int
SO_RCVLOWAT Informa del número mínimo de bytes a procesar para operaciones de entrada del socket. int
SO_RCVTIMEO Informa del valor del tiempo de espera para operaciones de entrada. array. La matriz contendrá dos claves: sec que es la parte de segundos del valor del tiempo límite y usec que es la parte de microsegundos del valor del tiempo límite.
SO_SNDTIMEO Informa del valor del tiempo de espera especificando la cantidad de tiempo que una función de salida bloquea porque el control de flujo evita el envío de información. array. La matriz contendrá dos claves: sec que es la parte de segundos del valor del tiempo límite y usec que es la parte de microsegundos del valor del tiempo límite.
SO_SNDLOWAT Informa del número mínimo de bytes a procesar por operaciones de salida del socket. int
TCP_NODELAY Informa si el algoritmo Nagle TCP está deshabilitado. int
MCAST_JOIN_GROUP Unirse a un grupo multidifusión. (añadido en PHP 5.4) Un array con claves "group", especificando un string con la dirección de la multidifusión IPv4 o IPv6 e "interface", especificando o un número de intefaz (de tipo int) o un string con el nombre de la interfaz, como "eth0". Se puede especificar 0 para indicar que la interfaz debería ser seleccionada usando las normas de enrutamiento. (Sólo se puede usar en la función socket_set_option())
MCAST_LEAVE_GROUP Abandonar un grupo multidifusión. (añadido en PHP 5.4) array. Véase MCAST_JOIN_GROUP para más información. (Sólo se puede usar en la función socket_set_option())
MCAST_BLOCK_SOURCE Bloquea los paquetes enviados desde un origen específico a un grupo multidifusión específico, al cual se ha tenido que unir previamente. (añadido en PHP 5.4) Un array con las mismas claves que en MCAST_JOIN_GROUP, más una clave extra, source, que hace referencia a un string que especifica una dirección IPv4 o IPv6 del origen a ser bloqueado. (Sólo se puede usar en la función socket_set_option())
MCAST_UNBLOCK_SOURCE Desbloquea (empieza a recibir de nuevo) paquetes enviados desde una dirección origen especificada a un grupo multidifusión especificado, al cual se ha tenido que unir previamente. (añadido en PHP 5.4) Un array con el mismo formato que MCAST_BLOCK_SOURCE. (Sólo se puede usar en la función socket_set_option())
MCAST_JOIN_SOURCE_GROUP Recibir paquetes destinados aun grupo multidifusión específico cuya dirección de origen coincide con un valor específico. (añadido en PHP 5.4) Un array con el mismo formato que MCAST_BLOCK_SOURCE. (Sólo se puede usar en la función socket_set_option())
MCAST_LEAVE_SOURCE_GROUP Dejar de recibir paquetes destinados a un grupo multidifusión específico cuya dirección de origen coincide con un valor específico. (añadido en PHP 5.4) Un array con el mismo formato que MCAST_BLOCK_SOURCE. (Sólo se puede usar en la función socket_set_option())
IP_MULTICAST_IF La interfaz saliente para paquetes multidifusión IPv4. (añadido en PHP 5.4) O un valor de tipo int especificando el número de la interfaz o un string con el nombre de la interfaz, como eth0. Se puede usar el valor 0 para indicar que la tabla de enrutamiento se usa en la selección de la interfaz. La función socket_get_option() devuelve un índice de interfaz. Observe que, a diferencia de la API de C, esta opción NO toma una dirección IP. Esto elimina las diferencias de interfaz entre IP_MULTICAST_IF y IPV6_MULTICAST_IF.
IPV6_MULTICAST_IF La interfaz saliente para paquetes multidifusión IPv6. (añadido en PHP 5.4) El mismo que IP_MULTICAST_IF.
IP_MULTICAST_LOOP La política de loopback multidifusión para paquetes IPv4, la cual determina si los paquetes enviados por este socket también alcanzan los receptores del mismo host al que se ha unidoal mismo grupo multidifusión en la interfaz saliente usada por este socket. Este es el caso por omisión. (añadido en PHP 5.4) Un valor de tipo int (0 ó 1). Para la función socket_set_option() será aceptado cualquier valor y será convertido a un booleano siguiendo la reglas habituales de PHP.
IPV6_MULTICAST_LOOP Análoga aIP_MULTICAST_LOOP, pero para IPv6. (añadido en PHP 5.4) Un valor de tipo int. Véase IP_MULTICAST_LOOP.
IP_MULTICAST_TTL El tiemp de vida de los paquetes multidifusión IPv4 salientes. Debería ser un valor entre 0 (no abandonar la interfaz) y 255. El valor predeterminado es 1 (sólo se alcanza la red local). (añadido en PHP 5.4) Un valor de tipo int entre 0 y 255.
IPV6_MULTICAST_HOPS Análoga a IP_MULTICAST_TTL, pero para paquetes IPv6. También se acepta el valor -1, lo que significa que debería usarse la ruta predeterminada. (añadido en PHP 5.4) Un valor de tipo int entre -1 y 255.

Valores devueltos

Devuelve el valor de la opción dada, o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de 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
13 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
13 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
10 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
0
skydiablo at gmx dot net
2 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