Página de manual do Linux
7/05/1999
manpages-pt
Portuguese Versions of the Manual Pages
manpages
Manual pages about using a GNU/Linux system
man-pages
Linux kernel and C library user-space interface documentation
NOME
socket - interface para socket Linux
SINOPSE
#include <sys/socket.h>
mysocket = socket(int socket_family, int socket_type, int protocol);
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, é enviado também. |
Write | POLLOUT | O socket tem espaço de buffer suficiente para escrever novos dados. |
Read/Write | POLLIN| POLLOUT |
Um 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. é enviado, então. |
Uma alternativa para poll/select é deixar o kernel informar o aplicativo sobre eventos através do sinal SIGIO
.Para isso, o flag 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.
.Para isso, o flag 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 .Para mais informações, veja 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 \(lqeth0\(rq, 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
TRADUZIDO POR LDP-BR em 21/08/2000.
Rubens de Jesus Nogueira <darkseid99> (tradução)
André L. Fassone Canova <lonelywolf> (revisão)
REFERENCED BY
tc-fq(8), tc-mqprio(8), tc-prio(8), sctp(7), accept(2), bind(2), bpf(2), getpeername(2), getsockname(2), getsockopt(2), listen(2), recv(2), recvmmsg(2), seccomp(2), send(2), sendmmsg(2), shutdown(2), socket(2), socketpair(2), cmsg(3), mtr(8), intro(2), ddp(7), ip(7), ipv6(7), packet(7), raw(7), tcp(7), udp(7), udplite(7), unix(7), x25(7), socket-event(7), upstart-socket-bridge(8), dbench(1), echoping(1), msocket(2viewos), af_smc(7), tc-etf(8), termy-server(1), dbench4(1), address_families(7)