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 — Obtém opções para o soquete
A função socket_get_option() recupera o valor para
a opção especificado pelo parâmetro option
para
o soquete informado no parâmetro socket
.
socket
Uma instância de Socket criada com socket_create() ou socket_accept().
level
O parâmetro level
especifica o nível de
protocolo no qual a opção reside. Por exemplo, para recuperar opções no
nível do soquete, um parâmetro level
com valor
SOL_SOCKET
seria usado. Outros níveis, como
TCP
, podem ser usados
especificando o número do protocolo para aquele nível. Números de protocolo podem ser
encontrados usando a função getprotobyname().
option
Opção | Descrição | Tipo |
---|---|---|
SO_DEBUG |
Reporta se a informação de depuração está sendo gravada. | int |
SO_BROADCAST |
Reporta se a transmissão de mensagens de difusão é suportada. | int |
SO_REUSEADDR |
Reporta se os endereços locais podem ser reutilizados. | int |
SO_REUSEPORT |
Reporta se as portas locais podem ser reutilizadas. | int |
SO_KEEPALIVE |
Reporta se as conexões são mantidas ativas com transmissão periódicas de mensagens. Se o soquete conectado falhar em responder a essas mensagens, a conexão é quebrada e os processos escrevendo nesse soquete são notificados com um sinal SIGPIPE. | int |
SO_LINGER |
Informa se o soquete especificado em Se l_onoff for diferente de zero e l_linger for zero, todos os dados não enviados serão descartados e o RST (redefinição) será enviado ao par no caso de um soquete orientado a conexão. Por outro lado, se l_onoff for diferente de zero e l_linger for diferente de zero, socket_close() irá bloquear até que todos os dados sejam enviados ou que tenha passado o tempo especificado em l_linger. Se o soquete for não bloqueante, socket_close() falhará e retornará um erro. |
array. O array conterá duas chaves: l_onoff e l_linger. |
SO_OOBINLINE |
Reporta se o socket mantém os dados fora-de-banda em linha.
|
int |
SO_SNDBUF |
Reporta o tamanho do buffer de envio. | int |
SO_RCVBUF |
Reporta o tamanho do buffer de recebimento. | int |
SO_ERROR |
Relata informações sobre o status do erro e o limpa. | int (não pode ser definido por socket_set_option()) |
SO_TYPE |
Reporta o tipo do socket (ex.:
SOCK_STREAM ).
|
int (não pode ser definido por socket_set_option()) |
SO_DONTROUTE |
Informa se as mensagens de saída ignoram os recursos de roteamento padrão. | int |
SO_RCVLOWAT |
Informa o número mínimo de bytes a serem processados para operações de
entrada de socket .
|
int |
SO_RCVTIMEO |
Informa o valor do tempo limite para operações de entrada. | array. O array conterá duas chaves: sec que é a parte dos segundos no valor do tempo limite e usec que é a parte dos microssegundos do valor do tempo limite. |
SO_SNDTIMEO |
Informa o valor do tempo limite especificando a quantidade de tempo que uma função de saída bloqueia porque o controle de fluxo impede o envio de dados. | array. O array conterá duas chaves: sec que é a parte dos segundos no valor do tempo limite e usec que é a parte dos microssegundos do valor do tempo limite. |
SO_SNDLOWAT |
Informa o número mínimo de bytes a serem processados para operações de saída do socket .
|
int |
TCP_NODELAY |
Informa se o algoritmo Nagle TCP está desabilitado. | int |
MCAST_JOIN_GROUP |
Ingressa em um grupo "multicast". |
array com chaves "group" , especificando
uma string com um endereço "multicast" IPv4 ou IPv6 e
"interface" , especificando um número de
interface (tipo int) ou uma string com
o nome da interface, como "eth0" .
0 pode ser especificado para indicar que a interface
deve ser selecionada usando regras de roteamento. (só pode ser usada em
socket_set_option())
|
MCAST_LEAVE_GROUP |
Sai de um grupo "multicast". |
array. Veja MCAST_JOIN_GROUP para
mais informação. (só pode ser usada em
socket_set_option())
|
MCAST_BLOCK_SOURCE |
Bloqueia pacotes que chegam de uma origem específica para um grupo "multicast" específico, no qual deve-se ter ingressado previamente. |
array com as mesmas chaves de
MCAST_JOIN_GROUP , mais uma chave extra,
source , que mapeia a uma string
especificando um endereço IPv4 ou IPv6 da origem a ser bloqueada.
(só pode ser usada em socket_set_option())
|
MCAST_UNBLOCK_SOURCE |
Desbloqueia (volta a receber) pacotes que chegam de um endereço de origem específico para um grupo "multicast" específico, no qual deve-se ter ingressado previamente. |
array com o mesmo formato de
MCAST_BLOCK_SOURCE .
(só pode ser usada em socket_set_option())
|
MCAST_JOIN_SOURCE_GROUP |
Recebe pacotes destinados a um grupo "multicast" específico cujo endereço de origem corresponde a um valor específico. |
array com o mesmo formato de
MCAST_BLOCK_SOURCE .
(só pode ser usada em socket_set_option())
|
MCAST_LEAVE_SOURCE_GROUP |
Para de receber pacotes destinados a um grupo "multicast" específico cujo endereço de origem corresponde a um valor específico. |
array com o mesmo formato de
MCAST_BLOCK_SOURCE .
(só pode ser usada em socket_set_option())
|
IP_MULTICAST_IF |
A interface de saída para pacotes "multicast" IPv4. |
Pode ser um int especificando o número da interface ou uma
string com um nome de interface, como
eth0 . O valor 0 pode ser usado para
indicar a tabela de roteamento a ser usada na seleção da interface.
A função socket_get_option() retorna um
índice de interface.
Observe que, diferentemente da API C, esta opção NÃO utiliza um endereço
IP. Isto elimina a diferença de interface entre
IP_MULTICAST_IF e
IPV6_MULTICAST_IF .
|
IPV6_MULTICAST_IF |
A interface de saída para pacotes "multicast" IPv6. |
O mesmo que IP_MULTICAST_IF .
|
IP_MULTICAST_LOOP |
A política de "loopback multicast" para pacotes IPv4 habilita ou desabilita o "loopback" de "multicasts" de saída, que devem ter sido previamente ingressados. O efeito difere, entretanto, se for aplicado em unixes ou Windows, o primeiro está no caminho de recepção enquanto o último está no caminho de envio. |
int (pode ser 0 ou
1 ). Para socket_set_option(),
qualquer valor será aceito e será convertido para um booleano
seguindo as regras normais do PHP.
|
IPV6_MULTICAST_LOOP |
Análoga a IP_MULTICAST_LOOP , porém para IPv6.
|
int. Veja IP_MULTICAST_LOOP .
|
IP_MULTICAST_TTL |
O tempo de vida dos pacotes de saída IPv4 "multicast". Deve ser um valor entre 0 (não sair da interface) e 255. O padrão é 1 (apenas a rede local é alcançada). | int entre 0 e 255. |
IPV6_MULTICAST_HOPS |
Análoga a IP_MULTICAST_TTL , porém para pacotes
IPv6. O valor -1 também é aceito e significa que a rota padrão
deve ser usada.
|
int entre -1 e 255. |
SO_MARK |
Define um identificador no soquete com o objetivo de filtrar pacotes no Linux. | int |
SO_ACCEPTFILTER |
Adicionar um filtro de aceitação no soquete sendo escutado (FreeBSD/NetBSD). Um módulo de kernel de filtro de aceitação precisa ser carregado antecipadamente no FreeBSD (ex.: accf_http). | string. Nome do filtro (comprimento máximo de 15). |
SO_USER_COOKIE |
Define um identificador no soquete com o objetivo de filtrar pacotes no FreeBSD. | int |
SO_RTABLE |
Define um identificador no soquete com o objetivo de filtrar pacotes no OpenBSD. | int |
SO_DONTTRUNC |
Retém dados não lidos. | int |
SO_WANTMORE |
Fornece uma dica de quando mais dados estão prontos. | int |
TCP_DEFER_ACCEPT |
Não notifica um soquete que estiver escutando até que os dados estejam prontos. | int |
SO_INCOMING_CPU |
Obtém/define a afinidade de CPU de um soquete. | int |
SO_MEMINFO |
Obtém todas as informações de memória de um soquete. | int |
SO_BPF_EXTENSIONS |
Obtém as extensões BPF suportadas pelo kernel para anexar a um soquete. | int |
SO_SETFIB |
Define a tabela de rotas (FIB) de um soquete. (Somente FreeBSD) | int |
SOL_FILTER |
Filtros atribuídos a um soquete. (Somente Solaris/Illumos) | int |
TCP_KEEPCNT |
Define o número máximo de sondas de manutenção de atividade que o TCP deve enviar antes de interromper a conexão. | int |
TCP_KEEPIDLE |
Define o tempo que a conexão precisa permanecer ociosa. | int |
TCP_KEEPINTVL |
Define o tempo entre sondagens de manutenção de atividade individuais. | int |
TCP_KEEPALIVE |
Define o tempo que a conexão precisa permanecer ociosa. (somente macOS) | int |
TCP_NOTSENT_LOWAT |
Define o número limite de dados não enviados na fila de escrita pelo fluxo de soquete. (somente Linux) | int |
Retorna o valor da opção informada, ou false
em caso de falha.
Versão | Descrição |
---|---|
8.0.0 |
O parâmetro socket agora espera uma instância de Socket;
anteriormente, um resource era esperado.
|
Exemplo #1 Exemplo 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;
}
}
?>