Linux x86_64Rede & sockets#299
recvmmsg
Recebe múltiplas mensagens de um socket datagrama em uma única chamada de sistema.
Descrição
Reduz drasticamente o overhead de syscall ao processar rajadas de pacotes (ex.: servidores DNS de alta taxa), recebendo várias mensagens de uma vez em vez de uma `recvmsg` por pacote.
man 2Desde o kernel 2.6.33
Assinatura
int recvmmsg(
int sockfd,
struct mmsghdr * msgvec,
unsigned int vlen,
int flags,
struct timespec * timeout
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| sockfd | int | Descritor do socket. |
| msgvec | struct mmsghdr * | Vetor de mensagens a preencher. |
| vlen | unsigned int | Número de elementos em `msgvec`. |
| flags | int | Flags como MSG_DONTWAIT, combinadas com as de recvmsg. |
| timeout | struct timespec * | Tempo máximo de espera pelas mensagens; NULL para bloquear indefinidamente. |
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 | msgvecstruct mmsghdr * |
| rdx | argumento 3 | vlenunsigned int |
| r10 | argumento 4 | flagsint |
| r8 | argumento 5 | timeoutstruct timespec * |
Valor de retorno
Número de mensagens recebidas 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.
- EINTR(4)
- Chamada interrompida por um sinal.
- EINVAL(22)
- Argumento inválido.
- EFAULT(14)
- Endereço de memória inválido (ponteiro fora do espaço de endereçamento válido).