Voltar à lista
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âmetroTipoDescrição
sockfdintDescritor do socket.
msgvecstruct mmsghdr *Vetor de mensagens a preencher.
vlenunsigned intNúmero de elementos em `msgvec`.
flagsintFlags como MSG_DONTWAIT, combinadas com as de recvmsg.
timeoutstruct timespec *Tempo máximo de espera pelas mensagens; NULL para bloquear indefinidamente.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1sockfdint
rsiargumento 2msgvecstruct mmsghdr *
rdxargumento 3vlenunsigned int
r10argumento 4flagsint
r8argumento 5timeoutstruct 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).

Relacionadas