socket

SOCKET(7)                  Manual do Programador Linux                 SOCKET(7)



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)



Página de Manual do Linux           7/05/1999                          SOCKET(7)