NOME¶
socket - interface para socket Linux
SINOPSE¶
#include <sys/socket.h>
mysocket = socket(int socket_family, int
socket_type, int protocol);
DESCRIÇÃO¶
Esta página do manual descreve a interface de usuário para a camada de
socket de rede Linux. Os sockets compatíveis com BSD são uma
interface uniforme entre o processo do usuário e as pilhas de protocolo
de rede no kernel. Os módulos de protocolo estão agrupados em
famílias de protocolos como
PF_INET,
PF_IPX,
PF_PACKET e
tipos de socket como
SOCK_STREAM ou
SOCK_DGRAM. Veja
socket(2) para mais informações sobre
famílias e tipos.
FUNÇÕES DA CAMADA DE SOCKET¶
Estas funções são usadas pelo processo do usuário para
enviar ou receber pacotes, e realizar outras operações de socket.
Para mais informações, veja as respectivas páginas de manual.
socket(2) cria um socket,
connect(2) conecta um socket a um
endereço de socket remoto, a função
bind(2) liga um
socket a um endereço de socket local,
listen(2) diz ao socket que
novas conexões serão aceitas, e
accept(2) é usado para
obter um novo socket com uma nova conexão de entrada.
socketpair(2) retorna dois sockets anônimos conectados (somente
implementados para algumas famílias locais, como
PF_UNIX)
send(2),
sendto(2), e
sendmsg(2) enviam dados através
de um socket, e
recv(2),
recvfrom(2),
recvmsg(2) recebem
dados de um socket.
poll(2) e
select(2) aguardam por dados que
chegam ou um estado de prontidão para enviar dados. Além disso, as
operações padrão de I/O como
write(2),
writev(2),
sendfile(2),
read(2), e
readv(2) podem ser usados para
ler e escrever dados.
getsockname(2) retorna o endereço local do socket e
getpeername(2) retorna o endereço remoto do socket.
getsockopt(2) e
setsockopt(2) são usados para setar ou
obter opções da camada de socket ou do protocolo.
ioctl(2)
pode ser usado para setar ou ler algumas outras opções.
close(2) é usado para encerrar um socket.
shutdown(2) encerra
partes de uma conexão de socket "full duplex".
A busca ou a chamada de
pread(2) ou
pwrite(2) com uma
posição diferente de zero não são suportados em sockets.
É possível fazer IO não-bloqueável em sockets
configurando-se o flag
O_NONBLOCK em um descritor de arquivo de socket,
usando
fcntl(2).
O_NONBLOCK é herdado através de um
accept. Então todas as operações que normalmente bloqueariam
(geralmente) retornarão com
EAGAIN;
connect(2) retorna um
erro do tipo
EINPROGRESS neste caso. O usuário pode então
esperar por vários eventos, via
poll(2) ou
select(2).
I/O events |
|
|
Evento |
Poll flag |
Ocorrência |
Read |
POLLIN |
Novo dado chegou. |
Read |
POLLIN |
Uma configuração de conexão foi completada (para sockets
orientados à conexão) |
Read |
POLLHUP |
Um pedido de desconexão foi iniciado pelo outro extremo. |
Read |
POLLHUP |
Uma conexão foi quebrada (somente para protocolos orientados à
conexão). Quando o socket é escrito, SIGPIPE é enviado
também. |
Write |
POLLOUT |
O socket tem espaço de buffer suficiente para escrever novos
dados. |
Read/Write |
POLLIN| POLLOUT |
Um connect (2) externo terminou. |
Read/Write |
POLLERR |
Ocorreu um erro assíncrono. |
Read/Write |
POLLHUP |
O outro extremo desligou uma direção. |
Exception |
POLLPRI |
Dado urgente chegou. SIGURG é enviado, então. |
. |
|
|
. |
|
|
. |
|
|
. |
|
|
. |
|
|
. |
|
|
. |
|
|
Uma alternativa para poll/select é deixar o kernel informar o aplicativo
sobre eventos através do sinal
SIGIO FASYNC deve ser
configurado em um descritor de arquivo de socket através
fcntl(2)
, e um manipulador de sinal válido para
SIGIO deve ser instalado
via
sigaction(2). Veja a discussão de
SINAIS abaixo.
OPÇÕES DE SOCKET¶
Estas opções de socket podem ser configuradas pelo uso de
setsockopt(2) , e lidas com
getsockopt(2) , com o nível de
socket setado em
SOL_SOCKET para todos os sockets:
- SO_KEEPALIVE
- Habilita o envio de mensagens "keep-alive" em
sockets orientados à conexão. Espera por um integer boolean
flag.
- SO_OOBINLINE
- Se esta opção é habilitada, dados
out-of-band são colocados diretamente no fluxo de dados de
recepção. Caso contrário, dados out-of-band são
passados apenas quando o flag MSG_OOB é setado durante a
recepção.
- SO_RCVLOWAT e SO_SNDLOWAT
- Especifica o número mínimo de bytes no buffer
até que a camada de socket passe os dados para o protocolo
(SO_SNDLOWAT) , ou para o usuário, ao receber um
(SO_RCVLOWAT). Estes dois valores não são alteráveis
em Linux, e o tamanho de seus argumentos são sempre fixados em 1
byte. getsockopt é capaz de lê-los; setsockopt
sempre retornará ENOPROTOOPT.
- SO_RCVTIMEO and SO_SNDTIMEO
- Especifica os timeouts de envio ou recepção,
até reportar um erro. Eles são fixados em uma
configuração Linux específica para cada protocolo, e
não pode ser lidos nem escritos. Suas funcionalidades podem ser
emuladas usando-se alarm(2) ou setitimer(2).
- SO_BSDCOMPAT
- Habilita a compatibilidade BSD bug-a-bug. Isto é usado
apenas no módulo do protocolo UDP e agendado para ser removido no
futuro. Se habilitado erros de ICMP recebidos de um socket UDP não
serão passados para o programa do usuário. O Linux 2.0
também habilita opções de compatibilidade BSD bug-a-bug
(mudança aleatória de cabeçalhos, salto do sinalizador de
broadcast) para sockets raw com estas opções, mas isso foi
removido no Linux 2.2. É melhor corrigir os programas do usuário
do que habilitar este sinalizador.
- SO_PASSCRED
- Habilita ou desabilita a recepção de mensagem de
controle SCM_CREDENTIALS unix(7).
- SO_PEERCRED
- Retorna as credenciais do processo estrangeiro conectado a
este socket. É útil somente para sockets PF_UNIX ; veja
unix(7). O argumento é uma estrutura ucred
getsockopt.
- SO_BINDTODEVICE
- Liga este socket a um dispositivo particular, como
“eth0”, como especificado no nome de interface passado. Se o
nome é uma string vazia, ou se o comprimento da opção
é zero, a ligação do dispositivo do socket é removido.
A opção passada é uma string de nome de interface com
comprimento variável e terminada em caractere nulo, com comprimento
máximo de IFNAMSIZ. Se um socket é ligado a uma
interface, somente os pacotes recebidos daquela interface particular
serão processados pelo socket.
- SO_DEBUG
- Habilita o debugging do socket. Somente permitido para
processos com a capabilidade CAP_NET_ADMIN ou com id efetivo de
usuário igual a 0.
- SO_REUSEADDR
- Indica que as regras usadas nos endereços de
validação fornecidos em uma chamada de bind(2)
permitiriam reusar os endereços locais. Para sockets PF_INET
isso significa que um socket pode ser ligado, exceto quando há um
socket em escuta ativo ligado ao endereço. Quando o socket em escuta
é ligado a INADDR_ANY com uma porta específica,
então não é possível ligá-lo a esta porta para
qualquer endereço local.
- SO_TYPE
- Obtém o tipo de socket como um inteiro (como
SOCK_STREAM). Só pode ser lido com getsockopt.
- SO_DONTROUTE
- Não envia através de um gateway, somente envia a
hosts conectados diretamente. O mesmo efeito pode ser atingido pela
configuração do flag MSG_DONTROUTE sobre uma
operação de socket send(2). Espera um flag booleano
inteiro.
- SO_BROADCAST
- Seta ou obtém o flag de broadcast. Quando habilitado,
os sockets de datagrama recebem pacotes enviados para um endereço de
broadcast, e eles têm permissão para enviar pacotes a um
endereço de broadcast. Esta opção não faz efeito em
sockets orientados a streams.
- SO_SNDBUF
- Seta ou obtém o buffer máximo de envio de socket
em bytes. O valor padrão é selecionado pelo sysctl
wmem_default e o máximo valor permitido é selecionado
pelo sysctl wmem_max
- SO_RCVBUF
- Seta ou obtém o máximo buffer de
recepção de socket em bytes. O valor default é setado pelo
sysctl rmem_default e o máximo valor permitido é setado
pelo sysctl rmem_max
- SO_LINGER
- Seleciona ou obtém a opção SO_LINGER.
O argumento é uma estrutura linger
struct linger {
int l_onoff; /* linger ativo */
int l_linger; /* quantos segundos para realizar linger */
};
- Quando habilitado, um close(2) ou um
shutdown(2) não retornarão até que todas as
mensagens para o socket que estiverem enfileiradas tenham sido enviadas
com sucesso, ou o timeout do linger tenha sido atingido. Caso
contrário, a chamada retorna imediatamente e o fechamento ocorre em
background. Quando o socket é encerrado como parte de exit(2)
, ele sempre realiza o linger em background.
- SO_PRIORITY
- Seta a prioridade definida por protocolo para todos os
pacotes a serem enviados sobre este socket. Os usuários de Linux usam
este valor para ordenar as filas de rede: pacotes com uma prioridade maior
podem ser processados primeiro, dependendo da disciplina de fila do
dispositivo selecionado. Para ip(7) , isto também configura o
campo IP "tipo-de-serviço (TOS)" para pacotes de
saída.
- SO_ERROR
- Obtém e limpa erros de socket pendentes. Somente
válido como um getsockopt. Espera um inteiro.
SINAIS¶
Quando se escreve para um socket orientado a conexão que foi derrubado
(pela extremidade local ou pela remota),
SIGPIPE é enviado para o
processo de escrita e
EPIPE é retornado. O sinal não é
enviado quando a chamada de escrita especificou o sinalizador
MSG_NOSIGNAL
Quando pedido com o fcntl
FIOCSETOWN ou com o ioctl
SIOCSPGRP ,
SIGIO é enviado quando ocorre um evento de I/O. É
possível usar
poll(2) ou
select(2) em um manipulador de
sinal para descobrir sobre qual socket o evento ocorreu. Uma alternativa (em
Linux 2.2) é configurar um sinal de realtime usando o fnctl
F_SETSIG ; o manipulador do sinal de tempo real será chamado com o
descritor de arquivo no campo
si_fd do seu
siginfo_t. Veja
fcntl(2) para mais informações.
Sob certas circunstâncias (por exemplo, múltiplos processos acessando
um único socket), a condição que causou o
SIGIO pode
já ter desaparecido quando o processo reagir ao sinal. Se isso acontecer,
o processo deveria esperar novamente porque o Linux reenviará o sinal
mais tarde.
SYSCTLS¶
Os sysctls de núcleo para rede de sockets podem ser acessados usando-se os
arquivos
/proc/sys/net/core/* , ou com a interface
sysctl(2)
- rmem_default
- contém a configuração padrão, em bytes,
do buffer de recepção de sockets.
- rmem_max
- contém o tamanho máximo do buffer de
recepção de sockets, em bytes, que um usuário pode
selecionar pelo uso da opção de socket SO_RCVBUF
- wmem_default
- contém a configuração padrão, em bytes,
do buffer de envio de sockets.
- wmem_max
- contém o tamanho máximo do buffer de
recepção de sockets, em bytes, que um usuário pode setar
pelo uso da opção de socket SO_SNDBUF
- message_cost and message_burst
- configuram o filtro bucket de token usado para carregar o
limite de mensagens de atenção causadas por eventos externos
à rede.
- netdev_max_backlog
- Número máximo de pacotes na fila global de
entrada.
- optmem_max
- Comprimento máximo dos dados ancilares e dos dados de
controle do usuário, como os iovecs por socket.
IOCTLS¶
Estes ioctls podem ser acessados usando-se
ioctl(2):
error = ioctl(ip_socket, ioctl_type, &value_result);
- SIOCGSTAMP
- Retorna um struct timeval com o timestamp de
recepção do último pacote passado ao usuário. Isto
é útil para medidas precisas do tempo de "round trip".
Veja setitimer(2) para uma descrição de struct
timeval.
- SIOCSPGRP
- Seta o processo ou grupo de processos para os quais se
enviam sinais SIGIO ou SIGURG quando uma operação
de I/O assíncrona terminou, ou quando dados urgentes estão
disponíveis. O argumento é um ponteiro para pid_t. Se o
argumento é positivo, envia os sinais para aquele processo. Se o
argumento é negativo, envia os sinais ao grupo de processos com o id
de valor absoluto do argumento. O processo só pode escolher a si
mesmo ou a seu próprio grupo de processos para receber sinais, a
menos que ele tenha a capabilidade CAP_KILL ou um UID efetivo igual
a 0.
- FIOASYNC
- Altera o flag O_ASYNC para habilitar ou desabilitar
o modo de IO assíncrono do socket. Modo de IO assíncrono
significa que o sinal SIGIO , ou os sinais setados com
F_SETSIG é raised quando ocorre um novo evento de I/O.
- O argumento é um sinalizador booleano inteiro.
- SIOCGPGRP
- Obtém o processo corrente ou grupo de processos que
recebem sinais SIGIO ou SIGURG , ou 0 quando nenhum foi
configurado.
fcntls válidos:
- FIOCGETOWN
- O mesmo que o ioctl SIOCGPGRP
- FIOCSETOWN
- O mesmo que o ioctl SIOCSPGRP
NOTAS¶
O Linux assume que metade do buffer de envio/recepção é usado
para estruturas internas do kernel; portanto, os sysctls são o dobro do
que podem ser observados no wire.
PROBLEMAS¶
As opções de socket
CONFIG_FILTER ,
SO_ATTACH_FILTER e
SO_DETACH_FILTER não são documentadas. A interface sugerida
para usá-las é via biblioteca libpcap.
VERSÕES¶
SO_BINDTODEVICE foi introduzido no Linux 2.0.30.
SO_PASSCRED
é novo no Linux 2.2. Os sysctls são novos no Linux 2.2.
AUTORES¶
Esta página de manual foi escrita por Andi Kleen.
VEJA TAMBÉM¶
socket(2),
ip(7),
setsockopt(2),
getsockopt(2),
packet(7),
ddp(7)
TRADUZIDO POR LDP-BR em 21/08/2000.¶
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução)
André L. Fassone Canova <lonelywolf@blv.com.br>
(revisão)