sub-rotina sendmsg
Propósito
Envia uma mensagem de um soquete usando uma estrutura de mensagens.
Biblioteca
Biblioteca C Padrão (libc.a)
Sintaxe
Descrição
A subroutine sendmsg envia mensagens através de soquetes conectados ou não conectados usando a estrutura de mensagens msghdr . O arquivo /usr/include/sys/socket.h contém a estrutura msghdr e define os membros da estrutura. No BSD 4.4, o tamanho e os membros da estrutura da mensagem msghdr foram modificados Os aplicativos que desejam iniciar a estrutura antiga precisam compilar com COMPAT_43 definido. O comportamento padrão é o do BSD 4.4
Para transmitir em um socket, o programa de aplicativos deve primeiro emitir um subroutine setsockopt usando a opção SO_BROADCAST para ganhar permissões de transmissão.
A subroutina sendmsg suporta apenas 15 elementos de mensagem.
Todos os aplicativos contendo a subroutine sendmsg devem ser compilados com o macro conjunto _BSD para um valor específico. Os valores aceitáveis são 43 e 44. Além disso, todos os aplicativos de soquete devem incluir a biblioteca BSD libbsd.a ..
A rotina sendmsg suporta elementos de dados complementares IPv6 conforme definido na API de Advanced Sockets para IPv6.
Parâmetros
| Item | Descrição |
|---|---|
| Soquete | Especifica o descritor de socket. |
| Mensagem | Aponta para a estrutura de mensagem msghdr contendo a mensagem a ser enviada. |
| Sinalizações | Permite que o remetente controle a transmissão da mensagem. O arquivo sys/socket.h contém o parâmetro Flags . O Parâmetro Flags usado para enviar uma chamada é formado logicamente ORing um ou ambos os valores a seguir:
Nota: O valor a seguir não é para uso geral. Trata-se de uma ferramenta administrativa utilizada para depuração ou para programas de roteamento.
|
Valores De Retorno
Após a conclusão bem-sucedida, a subroutine sendmsg retorna o número de caracteres enviados.
Se a subroutine sendmsg não for bem-sucedida, o manipulador do sistema executa as seguintes funções:
- Retorna um valor de -1 para o programa de chamada.
- Move um código de erro, indicando o erro específico, na variável global errno .
Códigos De Erro
A subroutine sendmsg não é bem-sucedida se ocorrer qualquer um dos seguintes erros:
| Erro | Descrição |
|---|---|
| EACCES | O acesso de gravação ao socket nomeado é negado, ou o socket tentando enviar um pacote de broadcast não tem capacidade de transmissão. |
| EADDRNOTAVAIL | O endereço especificado não é um endereço válido. |
| EAFNOSUPPORT | O endereço especificado não é um endereço válido para a família de endereços deste soquete. |
| EBADF | O parâmetro Socket não é válido. |
| ECONNRESET | Uma conexão foi forcivelmente fechada por um peer. |
| EDESTADDRREQ | O socket não está em modo de conexão e não tem seu conjunto de endereços de pares. |
| EFAULT | O parâmetro Address não está em uma parte gravável do espaço de endereço do usuário. |
| EHOSTUNREACH | O host de destino não pode ser alcançado. |
| EINTR | Um sinal interrompeu a subroutina sendmsg antes de qualquer dado ser transmitido. |
| EINVAL | O comprimento da estrutura msghdr é inválido. |
| EISCONN | Um soquete SOCK_DGRAM já está conectado. |
| EMSGSIZE | A mensagem é muito grande para ser enviada tudo de uma só vez (como o soquete requer), ou o membro msg_iovlen da estrutura msghdr apontada pelo parâmetro Messages é menor ou igual a 0 ou é maior que IOV_MAX. |
| ENOENTE | O nome do caminho não aponta um arquivo existente, ou o nome do caminho é uma string vazia. |
| ENETUNREACH | A rede de destino não é alcançável. |
| ENOBUFS | O sistema ficou sem memória para uma estrutura de dados interna. |
| ENOMEM | O espaço de dados disponível na memória não é grande o suficiente para manter informações de listas de controle de grupo ou de controle de acesso (ACL). |
| ENOPROTOOPT | O protocolo não é 64-bit apoiado. |
| ENOTCONN | O socket está em modo de conexão mas não está conectado. |
| ENOTSOCK | O parâmetro Socket refere-se a um arquivo, não a um soquete. |
| EOPNOTSUPP | O argumento socket está associado a um socket que não suporta um ou mais dos valores configurados em flags. |
| EPIPE | Uma tentativa foi feita para enviar em um socket que estava conectado, mas a conexão é desativada tanto pelo peer remoto ou por este lado da conexão. Se o socket for do tipo SOCK_STREAM, o sinal SIGPIPE é gerado para o processo de chamada. |
| EWOULDBLOCK | O soquete é marcado sem bloqueio, e nenhuma conexão está presente para ser aceita. |