Dutch PHP Conference 2025 - Call For Papers

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

add a note

User Contributed Notes 4 notes

up
5
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
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
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