Compartilhar via


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

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

Sintaxe

LPFN_RIOSEND LpfnRiosend;

BOOL LpfnRiosend(
  RIO_RQ SocketQueue,
  PRIO_BUF pData,
  ULONG DataBufferCount,
  DWORD Flags,
  PVOID RequestContext
)
{...}

Parâmetros

SocketQueue

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

pData

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

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

DataBufferCount

Um parâmetro de contagem de buffer de dados que indica se os dados devem ser enviados 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.

Flags

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

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 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 de 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 RIOSend , quando o sinalizador RIO_MSG_COMMIT_ONLY é definido, as chamadas para a função RIOSend não precisam ser serializadas. Para um único RIO_RQ, a função RIOSend pode ser chamada com RIO_MSG_COMMIT_ONLY em um thread ao chamar a função RIOSend 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ção, mas ela pode ou não disparar a execução da solicitação.

O envio de dados pode ser atrasado até que uma solicitação de envio seja feita no RIO_RQ passado no parâmetro SocketQueue sem o conjunto de sinalizadores RIO_MSG_DEFER . Para disparar a execução de todos os envios em uma fila de envio, chame a função RIOSend ou RIOSendEx sem o sinalizador RIO_MSG_DEFER definido.

Observação

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

RequestContext

Retornar valor

Se nenhum erro ocorrer, a função RIOSend retornará TRUE. Nesse caso, a operação de envio foi 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 Flags contiver um valor não válido para uma operação de envio 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 Memória suficiente não pôde ser alocada. 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 envio.
WSA_IO_PENDING A operação foi iniciada com êxito e a conclusão será enfileirada posteriormente.

Comentários

Um aplicativo pode usar a função RIOSend para enviar dados de rede de qualquer buffer completamente contido em um único buffer registrado. Os membros Offset e Length da estrutura RIO_BUF apontada pelo parâmetro pData determinam os dados de rede a serem enviados do buffer.

O buffer associado a uma operação de envio não deve ser usado simultaneamente com outra operação de envio ou recebimento. O buffer e o registro de buffer devem permanecer válidos durante a operação de envio. Isso significa que você não deve passar o mesmo PRIO_BUF para uma solicitação RIOSend(Ex) quando já estiver pendente. Somente depois que uma solicitação RIOSend(Ex) for concluída, você deverá usar novamente o mesmo PRIO_BUF (com o mesmo deslocamento ou com um deslocamento e comprimento diferentes). Além disso, quando o envio de dados faz referência a um buffer registrado (uma parte ou o buffer inteiro), todo o buffer registrado não deve ser usado até que o envio seja concluído. Isso inclui o uso de uma parte do buffer registrado para uma operação de recebimento ou outra operação de envio.

O parâmetro Flags pode ser usado para influenciar o comportamento da função RIOSend 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 RIOSend 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. Com ê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