LPFN_RIORECEIVEEX função de retorno de chamada (mswsock.h)

A função RIOReceiveEx recebe dados de rede em um soquete TCP de E/S registrado conectado ou em um soquete UDP de E/S registrado associado com opções adicionais para uso com as extensões de E/S registradas do Winsock.

Sintaxe

LPFN_RIORECEIVEEX LpfnRioreceiveex;

int LpfnRioreceiveex(
                                                                                                                     RIO_RQ SocketQueue,
                                                                                                                     PRIO_BUF pData,
                                                                                                                     ULONG DataBufferCount,
                                                                                                                     PRIO_BUF pLocalAddress,
                                                                                                                     PRIO_BUF pRemoteAddress,
                                                                                                                     PRIO_BUF pControlContext,
                                                                                                                     PRIO_BUF pFlags,
                                                                                                                     DWORD Flags,
                                                                                                                     PVOID RequestContext
)
{...}

Parâmetros

SocketQueue

Um descritor que identifica um soquete UDP de E/S registrado conectado ou um soquete UDP de E/S associado.

pData

Uma descrição da parte do buffer registrado na qual receber dados.

Esse parâmetro poderá ser NULL para um soquete UDP de E/S associado se o aplicativo não precisar receber uma carga de dados no datagrama UDP.

DataBufferCount

Um parâmetro de contagem de buffer de dados que indica se os dados devem ser recebidos no buffer apontado pelo parâmetro pData .

Esse parâmetro deverá ser definido como zero se o pData for NULL. Caso contrário, esse parâmetro deve ser definido como 1.

pLocalAddress

Um segmento de buffer que, após a conclusão, conterá o endereço local no qual os dados de rede foram recebidos.

Esse parâmetro poderá ser NULL se o aplicativo não quiser receber o endereço local. Se esse parâmetro não for NULL, o segmento de buffer deverá ter pelo menos o tamanho de uma estrutura SOCKADDR_INET .

pRemoteAddress

Um segmento de buffer que, após a conclusão, conterá o endereço remoto do qual os dados de rede foram recebidos.

Esse parâmetro poderá ser NULL se o aplicativo não quiser receber o endereço remoto. Se esse parâmetro não for NULL, o segmento de buffer deverá ter pelo menos o tamanho de uma estrutura SOCKADDR_INET .

pControlContext

Uma fatia de buffer que, após a conclusão, conterá informações de controle adicionais sobre a operação de recebimento.

Esse parâmetro poderá ser NULL se o aplicativo não quiser receber as informações de controle adicionais.

pFlags

Flags

Um conjunto de sinalizadores que modificam o comportamento da função RIOReceiveEx .

O parâmetro Flags pode conter uma combinação das seguintes opções, definidas no arquivo de Mswsockdef.h cabeçalho:

RIO_MSG_COMMIT_ONLY

As solicitações anteriores adicionadas com RIO_MSG_DEFER sinalizador serão confirmadas.

Quando o sinalizador RIO_MSG_COMMIT_ONLY é definido, nenhum outro sinalizador pode ser especificado. Quando o sinalizador RIO_MSG_COMMIT_ONLY é definido, os argumentos pData, pLocalAddress, pRemoteAddress, pControlContext, pFlags e RequestContext devem ser NULL e o argumento DataBufferCount deve ser zero.

Normalmente, esse sinalizador seria usado ocasionalmente depois que várias solicitações fossem emitidas com o sinalizador RIO_MSG_DEFER definido. Isso elimina a necessidade ao usar o sinalizador RIO_MSG_DEFER para fazer a última solicitação sem o sinalizador RIO_MSG_DEFER , o que faz com que a última solicitação seja concluída muito mais lentamente do que outras solicitações.

Ao contrário de outras chamadas para a função RIOReceiveEx , quando o sinalizador RIO_MSG_COMMIT_ONLY é definido, as chamadas para a função RIOReceiveEx não precisam ser serializadas. Para um único RIO_RQ, a função RIOReceiveEx pode ser chamada com RIO_MSG_COMMIT_ONLY em um thread ao chamar a função RIOReceiveEx em outro thread.

RIO_MSG_DONT_NOTIFY

A solicitação não deve disparar a função RIONotify quando a conclusão da solicitação é inserida em sua fila de conclusão.

RIO_MSG_DEFER

A solicitação não precisa ser executada imediatamente. Isso inserirá a solicitação na fila de solicitações, mas pode ou não disparar a execução da solicitação.

A recepção de dados pode ser atrasada até que uma solicitação de recebimento seja feita na RIO_RQ passada no parâmetro SocketQueue sem o sinalizador RIO_MSG_DEFER definido. Para disparar a execução de todos os recebimentos em uma fila de solicitação, chame a função RIOReceive ou RIOReceiveEx sem o sinalizador RIO_MSG_DEFER definido.

Observação

A solicitação de recebimento é cobrada contra a capacidade de E/S pendente na RIO_RQ passada no parâmetro SocketQueue , independentemente de RIO_MSG_DEFER ser definida.

RIO_MSG_WAITALL

A função RIOReceiveEx não será concluída até que ocorra um dos seguintes eventos:

  • A fatia de buffer fornecida pelo chamador no parâmetro pData está completamente cheia.
  • A conexão foi fechada.
  • A solicitação foi cancelada ou ocorreu um erro.

Não há suporte para esse sinalizador em soquetes de datagrama ou em soquetes sem conexão orientados a mensagens.

RequestContext

O contexto de solicitação a ser associado a essa operação de recebimento.

Retornar valor

Se nenhum erro ocorrer, a função RIOReceiveEx retornará TRUE. Nesse caso, a operação de recebimento é iniciada com êxito e a conclusão já terá sido enfileirada ou a operação foi iniciada com êxito e a conclusão será enfileirada posteriormente.

Um valor false indica que a função falhou, a operação não foi iniciada com êxito e nenhuma indicação de conclusão será enfileirada. Um código de erro específico pode ser recuperado chamando a função WSAGetLastError .

Código de retorno Descrição
WSAEFAULT O sistema detectou um endereço de ponteiro inválido ao tentar usar um argumento de ponteiro em uma chamada. Esse erro será retornado se um identificador de buffer for desregistrado ou um buffer for liberado para qualquer uma das estruturas de RIO_BUF passadas em parâmetros antes que a operação seja enfileirada ou invocada.
WSAEINVAL Um parâmetro inválido foi passado para a função.
Esse erro será retornado se o parâmetro SocketQueue não for válido, o parâmetro dwFlags contiver um valor inválido para uma operação de recebimento ou a integridade da fila de conclusão tiver sido comprometida. Esse erro também pode ser retornado para outros problemas com parâmetros.
WSAENOBUFS Não foi possível alocar memória suficiente. Esse erro será retornado se a fila de conclusão de E/S associada ao parâmetro SocketQueue estiver cheia ou a fila de conclusão de E/S tiver sido criada sem entradas de recebimento.
WSA_OPERATION_ABORTED A operação foi cancelada enquanto a operação de recebimento estava pendente. Esse erro será retornado se o soquete for fechado local ou remotamente ou o comando SIO_FLUSH no WSAIoctl for executado.

Comentários

Um aplicativo pode usar a função RIOReceiveEx para receber dados de rede em qualquer buffer completamente contido em um único buffer registrado. Os membros Offset e Length da estrutura RIO_BUF apontada pelo parâmetro pData determinam onde os dados de rede são recebidos no buffer.

Depois que a função RIOReceiveEx for chamada, o buffer passado no parâmetro pData , incluindo o RIO_BUFFERID no membro BufferId da estrutura RIO_BUF deve permanecer válido durante a operação de recebimento.

Para evitar condições de corrida, um buffer associado a uma solicitação de recebimento não deve ser lido ou gravado antes da conclusão da solicitação. Isso inclui o uso do buffer como a origem de uma solicitação de envio ou o destino de outra solicitação de recebimento. Partes de um buffer registrado não associadas a nenhuma solicitação de recebimento não estão incluídas nessa restrição.

O parâmetro pLocalAddress pode ser usado para recuperar o endereço local em que os dados foram recebidos. O parâmetro pRemoteAddress pode ser usado para recuperar o endereço remoto do qual os dados foram recebidos. Os endereços locais e remotos são retornados como estruturas SOCKADDR_INET . Como resultado, o membro Length do RIO_BUF apontado pelos parâmetros pLocalAddress ou pRemoteAddress deve ser igual ou maior que o tamanho de uma estrutura SOCKADDR_INET .

A tabela a seguir resume os vários usos de dados de controle disponíveis para uso com as informações de controle no membro pControlContext .

Protocolo cmsg_level cmsg_type Descrição
IPv4 IPPROTO_IP IP_ORIGINAL_ARRIVAL_IF Recebe a interface de chegada IPv4 original em que o pacote foi recebido para soquetes de datagrama. Esses dados de controle são usados por firewalls quando um túnel Teredo, 6to4 ou ISATAP é usado para passagem NAT IPv4.
O membro cmsg_data[] é um ULONG que contém o IF_INDEX definido no arquivo de cabeçalho ifdef.h .
Para obter mais informações, consulte as Opções de soquete IPPROTO_IP para a opção de soquete IP_ORIGINAL_ARRIVAL_IF.
IPv4 IPPROTO_IP IP_PKTINFO Especifica/recebe informações de pacote.
Para obter mais informações, consulte as Opções de soquete IPPROTO_IP para a opção de soquete IP_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_DSTOPTS Especifica/recebe opções de destino.
IPv6 IPPROTO_IPV6 IPV6_HOPLIMIT Especifica/recebe o limite de salto.
Para obter mais informações, consulte as Opções de soquete IPPROTO_IPV6 para a opção de soquete IPV6_HOPLIMIT.
IPv6 IPPROTO_IPV6 IPV6_HOPOPTS Especifica/recebe opções de salto por salto.
IPv6 IPPROTO_IPV6 IPV6_NEXTHOP Especifica o endereço do próximo salto.
IPv6 IPPROTO_IPV6 IPV6_PKTINFO Especifica/recebe informações de pacote.
Para obter mais informações, consulte as Opções de soquete IPPROTO_IPV6 para a opção de soquete IPV6_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_RTHDR Especifica/recebe o cabeçalho de roteamento.

Os dados de controle são compostos por um ou mais objetos de dados de controle, cada um começando com uma estrutura WSACMSGHDR , definida como o seguinte:

} WSACMSGHDR;

Os membros da estrutura WSACMSGHDR são os seguintes:

Termo Descrição
cmsg_len O número de bytes de dados que começam desde o início do WSACMSGHDR até o final dos dados (excluindo bytes de preenchimento que podem seguir os dados).
cmsg_level O protocolo que originou as informações de controle.
cmsg_type O tipo específico de protocolo de informações de controle.

O parâmetro Flags pode ser usado para influenciar o comportamento da invocação da função RIOReceiveEx além das opções especificadas para o soquete associado. O comportamento dessa função é determinado por uma combinação de todas as opções de soquete definidas no soquete associado ao parâmetro SocketQueue e aos valores especificados no parâmetro Flags .

Observação

O ponteiro de função para a função RIOReceiveEx deve ser obtido em tempo de execução fazendo uma chamada para a função WSAIoctl com o SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode especificado. O buffer de entrada passado para a função WSAIoctl deve conter WSAID_MULTIPLE_RIO, um GUID (identificador global exclusivo) cujo valor identifica as funções de extensão de E/S registradas do Winsock. Em caso de êxito, a saída retornada pela função WSAIoctl contém um ponteiro para a estrutura RIO_EXTENSION_FUNCTION_TABLE que contém ponteiros para as funções de extensão de E/S registradas do Winsock. O SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL é definido no arquivo de cabeçalho Ws2def.h . O GUID WSAID_MULTIPLE_RIO é definido no arquivo de cabeçalho Mswsock.h .

Windows Phone 8: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.

Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.

Requisitos

Requisito Valor
Cabeçalho mswsock.h