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)