Provided by: manpages-pt_20040726-4_all bug

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|   │ Um connect(2) externo terminou.       │
       │           │ POLLOUT   │                                       │
       ├───────────┼───────────┼───────────────────────────────────────┤
       │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)