Voltar à lista
Linux x86_64Rede & sockets#46

sendmsg

Envia uma mensagem por um socket usando um vetor de buffers e, opcionalmente, dados de controle (ancillary data).

Descrição

Forma mais poderosa de envio: permite I/O vetorizado (múltiplos buffers em uma chamada, como writev) e transmitir dados fora de banda como descritores de arquivo (SCM_RIGHTS) via sockets AF_UNIX, ou opções de nível de pacote via ancillary data em sockets de rede.

Header: sys/socket.hman 2

Nota

É o único mecanismo padrão para transferir descritores de arquivo abertos entre processos não relacionados, via SCM_RIGHTS em um socket AF_UNIX.

Assinatura

ssize_t sendmsg(int sockfd, const struct msghdr * msg, int flags);

Parâmetros

ParâmetroTipoDescrição
sockfdintDescritor do socket.
msgconst struct msghdr *Estrutura com o vetor de buffers, endereço de destino e dados de controle.
flagsintMSG_DONTWAIT, MSG_NOSIGNAL, etc.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1sockfdint
rsiargumento 2msgconst struct msghdr *
rdxargumento 3flagsint

Valor de retorno

Número de bytes enviados em sucesso; -1 em erro, com errno definido.

Códigos de erro (errno)

EAGAIN(11)
Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
ECONNRESET(104)
Conexão resetada pelo par (peer).
EMSGSIZE(90)
Mensagem grande demais para o socket.
ENOBUFS(105)
Sem espaço em buffer disponível.
EPIPE(32)
Pipe quebrado (sem leitor do outro lado).

Relacionadas