função de retorno de chamada LPFN_TRANSMITPACKETS (mswsock.h)
A função TransmitPackets transmite dados na memória ou dados de arquivo por meio de um soquete conectado. A função TransmitPackets usa o gerenciador de cache do sistema operacional para recuperar dados de arquivo, bloqueando a memória pelo tempo mínimo necessário para transmitir e resultando em transmissão eficiente e de alto desempenho.
Sintaxe
LPFN_TRANSMITPACKETS LpfnTransmitpackets;
BOOL LpfnTransmitpackets(
SOCKET hSocket,
LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,
DWORD nElementCount,
DWORD nSendSize,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags
)
{...}
Parâmetros
hSocket
Um identificador para o soquete conectado a ser usado na transmissão. Embora o soquete não precise ser um circuito orientado à conexão, o destino/par padrão deve ter sido estabelecido usando a função connect, WSAConnect, accept, WSAAccept, AcceptEx ou WSAJoinLeaf .
lpPacketArray
Uma matriz do tipo TRANSMIT_PACKETS_ELEMENT, descrevendo os dados a serem transmitidos.
nElementCount
O número de elementos em lpPacketArray.
nSendSize
O tamanho, em bytes, do bloco de dados usado na operação de envio . Defina nSendSize como zero para permitir que a camada de soquetes selecione um tamanho de envio padrão.
Definir nSendSize como 0xFFFFFFF permite que o chamador controle o tamanho e o conteúdo de cada solicitação de envio , obtida usando o sinalizador TP_ELEMENT_EOP na matriz TRANSMIT_PACKETS_ELEMENT apontada no parâmetro lpPacketArray . Essa funcionalidade é útil para protocolos de mensagem que colocam limitações no tamanho de solicitações de envio individuais.
lpOverlapped
Um ponteiro para uma estrutura OVERLAPPED. Se o identificador de soquete especificado no parâmetro hSocket tiver sido aberto como sobreposto, use esse parâmetro para obter a operação de E/S assíncrona (sobreposta). Os identificadores de soquete são abertos como sobrepostos por padrão.
dwFlags
Um conjunto de sinalizadores usados para personalizar o processamento da função TransmitPackets . A tabela a seguir descreve o uso do parâmetro dwFlags .
Valor | Significado |
---|---|
|
Inicia uma desconexão no nível do transporte depois que todos os dados do arquivo são enfileirados para transmissão. Aplica-se somente a soquetes orientados à conexão. Especificar esse sinalizador para soquetes que não dão suporte à semântica de desconexão (como soquetes de datagrama) resulta em um erro. |
|
Prepara o identificador de soquete a ser reutilizado. Quando a função TransmitPackets for concluída, o identificador de soquete poderá ser passado para a função AcceptEx . Válido somente quando um soquete orientado à conexão e TF_DISCONNECT são especificados.
Nota A transmissão de pacote no nível do soquete está sujeita ao comportamento do transporte subjacente. Por exemplo, um soquete TCP pode estar sujeito ao estado de TIME_WAIT TCP, fazendo com que a chamada TransmitPackets seja atrasada.
|
|
Direciona Winsock para usar o thread padrão do sistema para processar solicitações de TransmitPackets longas. As solicitações Long TransmitPackets são definidas como solicitações que exigem mais de uma única leitura do arquivo ou de um cache; portanto, a definição de solicitação longa depende do tamanho do arquivo e do comprimento especificado do pacote de envio.
O thread padrão do sistema pode ser ajustado usando o seguinte parâmetro do Registro como umTransmissor de ParâmetrosAFD\ dosServiços\ REG_DWORD:HKEY_LOCAL_MACHINE\CurrentControlSet\Services\ |
|
Direciona Winsock para usar threads do sistema para processar solicitações de TransmitPackets longas. As solicitações Long TransmitPackets são definidas como solicitações que exigem mais de uma única leitura do arquivo ou de um cache; portanto, a definição de solicitação longa depende do tamanho do arquivo e do comprimento especificado do pacote de envio. |
|
Direciona Winsock para usar APCs ( Chamadas de Procedimento Assíncrono ) do kernel em vez de threads de trabalho para processar solicitações de TransmitPackets longas. As solicitações Long TransmitPackets são definidas como solicitações que exigem mais de uma única leitura do arquivo ou de um cache; portanto, a definição de solicitação longa depende do tamanho do arquivo e do comprimento especificado do pacote de envio. Confira Comentários para obter mais informações. |
Retornar valor
Se a função TransmitPackets for bem-sucedida, o valor retornado será TRUE. Caso contrário, o valor retornado será FALSE. Para obter informações de erro estendidas, chame WSAGetLastError. Um código de erro de WSA_IO_PENDING ou ERROR_IO_PENDING indica que a operação sobreposta foi iniciada com êxito e que a conclusão será indicada posteriormente. Qualquer outro código de erro indica que a operação sobreposta não foi iniciada com êxito e nenhuma indicação de conclusão ocorrerá. Os aplicativos devem lidar com ERROR_IO_PENDING ou WSA_IO_PENDING nesse caso.
Código de retorno | Descrição |
---|---|
Uma conexão estabelecida foi interrompida pelo software na sua máquina host. Esse erro será retornado se o circuito virtual tiver sido encerrado devido a um tempo limite ou outra falha. | |
uma conexão existente foi fechada forçadamente pelo host remoto. Esse erro é retornado para um soquete de fluxo quando o circuito virtual foi redefinido pelo lado remoto. O aplicativo deve fechar o soquete porque ele não pode ser mais usado. | |
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 o lpPacketArray ou o parâmetro lpOverlapped não estiver totalmente contido em uma parte válida do espaço de endereço do usuário. | |
Foi fornecido um argumento inválido. Esse erro será retornado se o parâmetro dwFlags tiver o sinalizador TF_REUSE_SOCKET definido, mas o sinalizador TF_DISCONNECT não estiver definido. Esse erro também será retornado se o deslocamento especificado na estrutura OVERLAPPED apontada pelo lpOverlapped não estiver dentro do arquivo. Esse erro também será retornado se o número total de bytes a serem transmitidos for um valor maior que 2.147.483.646, o valor máximo para um inteiro de 32 bits menos 1. | |
Uma operação de soquete encontrou uma rede morta. Esse erro será retornado se o subsistema de rede falhar. | |
A conexão foi interrompida porque a atividade de manutenção de funcionamento detectou uma falha enquanto a operação estava em andamento. Esse erro é retornado para um soquete de fluxo em que a conexão foi interrompida devido à atividade keep alive detectando uma falha. | |
Não foi possível executar uma operação em um soquete porque o sistema não tinha espaço suficiente no buffer ou porque uma fila estava cheia. Esse erro também será retornado se o provedor do Windows Sockets relatar um deadlock de buffer. | |
Uma solicitação para enviar ou receber dados não foi permitida porque o soquete não está conectado. Esse erro é retornado para um soquete de fluxo. | |
Houve uma tentativa de executar uma operação em algo que não é um soquete. Esse erro será retornado se o parâmetro hSocket não for um soquete. | |
Uma solicitação para enviar ou receber dados não foi permitida, pois o soquete já havia sido desligado nessa direção com uma chamada de desligamento anterior. Esse erro será retornado se um soquete de fluxo tiver sido desligado para envio. Não é possível chamar TransmitFile em um soquete de fluxo depois que a função de desligamento tiver sido chamada no soquete com o parâmetro how definido como SD_SEND ou SD_BOTH. | |
O aplicativo não chamou a função WSAStartup ou WSAStartup falhou. Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar a função TransmitFile . | |
Uma operação de E/S sobreposta está em andamento. Esse valor será retornado se uma operação de E/S sobreposta tiver sido iniciada com êxito e indicar que a conclusão será indicada posteriormente. | |
A operação de E/S foi anulada devido ao encerramento de um thread ou a uma solicitação de aplicativo. Esse erro será retornado se a operação sobreposta tiver sido cancelada devido ao fechamento do soquete, à execução do comando "SIO_FLUSH" no WSAIoctl ou ao thread que iniciou a solicitação sobreposta encerrada antes da conclusão da operação.
Nota Todas as E/S iniciadas por um determinado thread são canceladas quando esse thread é encerrado. Para soquetes sobrepostos, as operações assíncronas pendentes podem falhar se o thread for fechado antes da conclusão das operações assíncronas. Para obter mais informações, consulte ExitThread.
|
Comentários
A função TransmitPackets é otimizada de acordo com o sistema operacional no qual ela é usada:
- Nas edições do Windows Server, a função TransmitPackets é otimizada para alto desempenho.
- Nas edições do cliente Windows, a função TransmitPackets é otimizada para utilização mínima de memória e recursos.
O número máximo de bytes que podem ser transmitidos usando uma única chamada para a função TransmitPackets é 2.147.483.646, o valor máximo para um inteiro de 32 bits menos 1. Se um aplicativo precisar transmitir dados maiores que 2.147.483.646 bytes, várias chamadas para a função TransmitPackets poderão ser usadas com cada chamada transferindo no máximo 2.147.483.646 bytes.
Espere melhores resultados de desempenho ao usar a função TransmitPackets no Windows Server 2003.
Quando lpOverlapped não é NULL, a E/S sobreposta pode não ser concluída antes que a função TransmitPackets retorne. Quando isso ocorre, a função TransmitPackets retorna falha e uma chamada para a função WSAGetLastError retorna ERROR_IO_PENDING, permitindo que o chamador continue processando enquanto a transmissão é concluída.
ApCs (chamadas de procedimento assíncrono) e TransmitPackets
O uso do sinalizador TF_USE_KERNEL_APC pode oferecer benefícios significativos de desempenho. Se o thread que inicia a chamada de função TransmitPackets estiver sendo usado para cálculos pesados, é possível, embora improvável, que as APCs possam ser impedidas de iniciar.
- As APCs de kernel são iniciadas quando um thread está em um estado de espera.
- As APCs no modo de usuário são iniciadas quando um thread está em um estado de espera alertável.
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 |
---|---|
Cliente mínimo com suporte | Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | mswsock.h |