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.
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
socket_get_option — Obtiene las opciones de socket para el socket
La función socket_get_option() recupera el valor de
la opción especificada por el parámetro optname
para el
socket
especificado.
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
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 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. |
Devuelve el valor de la opción dada, o false
en caso de error.
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));
?>
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.
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).
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.
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;
}
}
?>