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 2Nota
É 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âmetro | Tipo | Descrição |
|---|---|---|
| sockfd | int | Descritor do socket. |
| msg | const struct msghdr * | Estrutura com o vetor de buffers, endereço de destino e dados de controle. |
| flags | int | MSG_DONTWAIT, MSG_NOSIGNAL, etc. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | sockfdint |
| rsi | argumento 2 | msgconst struct msghdr * |
| rdx | argumento 3 | flagsint |
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).