socket_get_option

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

socket_get_optionObtém opções para o soquete

Descrição

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

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.

Parâmetros

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ções de Soquete Disponíveis
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 socket permanece em socket_close() se houver dados presentes. Por padrão, quando o soquete é fechado, ele tenta enviar todos os dados não enviados. No caso de um soquete orientado a conexão, socket_close() aguardará que seu par reconheça os dados.

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

Valor Retornado

Retorna o valor da opção informada, ou false em caso de falha.

Registro de Alterações

Versão Descrição
8.0.0 O parâmetro socket agora espera uma instância de Socket; anteriormente, um resource era esperado.

Exemplos

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));
?>

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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=c617f398edd4db2b8567a28e899a88f8f574798dit 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