Código de controle SIO_LOOPBACK_FAST_PATH
Descrição
O código de controle SIO_LOOPBACK_FAST_PATH configura um soquete TCP para menor latência e operações mais rápidas na interface de loopback.
Importante O SIO_LOOPBACK_FAST_PATH foi preterido e não é recomendável ser usado em seu código.
Para executar essa operação, chame a função WSAIoctl ou WSPIoctl com os parâmetros a seguir.
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
Parâmetros
s
Um descritor que identifica um soquete.
Dwiocontrolcode
O código de controle da operação. Use SIO_LOOPBACK_FAST_PATH para esta operação.
Lpvinbuffer
Um ponteiro para o buffer de entrada. Esse parâmetro contém um ponteiro para um valor booliano que indica se o soquete deve ser configurado para operações de loopback rápido.
Cbinbuffer
O tamanho, em bytes, do buffer de entrada.
Lpvoutbuffer
Um ponteiro para o buffer de saída. Esse parâmetro não é usado para essa operação.
cbOutBuffer
O tamanho, em bytes, do buffer de saída. Esse parâmetro deve ser definido como zero.
Lpcbbytesreturned
Um ponteiro para uma variável que recebe o tamanho, em bytes, dos dados armazenados no buffer de saída.
Se o buffer de saída for muito pequeno, a chamada falhará, WSAGetLastError retornará WSAEINVAL e o parâmetro lpcbBytesReturned apontará para um valor DWORD igual a zero.
Se lpOverlapped for NULL, o valor DWORD apontado pelo parâmetro lpcbBytesReturned retornado em uma chamada bem-sucedida não poderá ser zero.
Se o parâmetro lpOverlapped não for NULL para soquetes sobrepostos, as operações que não puderem ser concluídas imediatamente serão iniciadas e a conclusão será indicada posteriormente. O valor DWORD apontado pelo parâmetro lpcbBytesReturned retornado pode ser zero, pois o tamanho dos dados armazenados não pode ser determinado até que a operação sobreposta seja concluída. A conclusão final status pode ser recuperada quando o método de conclusão apropriado é sinalizado quando a operação é concluída.
lpvOverlapped
Um ponteiro para uma estrutura WSAOVERLAPPED .
Se o soquete s tiver sido criado sem o atributo sobreposto, o parâmetro lpOverlapped será ignorado.
Se s tiver sido aberto com o atributo sobreposto e o parâmetro lpOverlapped não for NULL, a operação será executada como uma operação sobreposta (assíncrona). Nesse caso, o parâmetro lpOverlapped deve apontar para uma estrutura WSAOVERLAPPED válida.
Para operações sobrepostas, a função WSAIoctl ou WSPIoctl retorna imediatamente e o método de conclusão apropriado é sinalizado quando a operação é concluída. Caso contrário, a função não retornará até que a operação seja concluída ou ocorra um erro.
Lpcompletionroutine
Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
Um ponteiro para a rotina de conclusão chamado quando a operação foi concluída (ignorado para soquetes não sobrepostos).
lpThreadId
Um ponteiro para uma estrutura WSATHREADID a ser usada pelo provedor em uma chamada subsequente para WPUQueueApc. O provedor deve armazenar a estrutura WSATHREADID referenciada (não o ponteiro para o mesmo) até que a função WPUQueueApc retorne.
Nota Esse parâmetro se aplica somente à função WSPIoctl .
Lperrno
Um ponteiro para o código de erro.
Nota Esse parâmetro se aplica somente à função WSPIoctl .
Valor retornado
Se a operação for concluída com êxito, a função WSAIoctl ou WSPIoctl retornará zero.
Se a operação falhar ou estiver pendente, a função WSAIoctl ou WSPIoctl retornará SOCKET_ERROR. Para obter informações de erro estendidas, chame WSAGetLastError.
Código do erro | Significado |
---|---|
WSA_IO_PENDING | A operação de E/S sobreposta está em andamento. Esse valor será retornado se uma operação sobreposta tiver sido iniciada com êxito e a conclusão for indicada posteriormente. |
WSA_OPERATION_ABORTED | 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 uma operação sobreposta tiver sido cancelada devido ao fechamento do soquete ou à execução do SIO_FLUSH comando IOCTL . |
WSAEACCES | Foi feita uma tentativa de acessar um soquete de forma proibida por suas permissões de acesso. Esse erro é retornado sob várias condições para reservas de porta persistentes que incluem o seguinte: o usuário não tem os privilégios administrativos necessários no computador local ou o aplicativo não está em execução em um shell avançado como o Administrador interno (RunAs administrator ). |
WSAEFAULT | O sistema detectou um endereço de ponteiro inválido ao tentar usar um argumento de ponteiro em uma chamada. Esse erro é retornado do parâmetro lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped ou lpCompletionRoutine não está totalmente contido em uma parte válida do espaço de endereço do usuário. |
WSAEINPROGRESS | Uma operação de bloqueio está atualmente em execução. Esse erro será retornado se a função for invocada quando um retorno de chamada estiver em andamento. |
WSAEINTR | Uma operação de bloqueio foi interrompida por uma chamada para WSACancelBlockingCall. Esse erro será retornado se uma operação de bloqueio tiver sido interrompida. |
WSAEINVAL | Foi fornecido um argumento inválido. Esse erro será retornado se o parâmetro dwIoControlCode não for um comando válido ou se um parâmetro de entrada especificado não for aceitável ou se o comando não for aplicável ao tipo de soquete especificado. |
WSAENETDOWN | Uma operação de soquete encontrou uma rede inoperante. Esse erro será retornado se o subsistema de rede falhar. |
WSAENOTSOCK | Uma operação foi tentada em algo que não é um soquete. Esse erro será retornado se o descritor s não for um soquete. |
WSAEOPNOTSUPP | Não há suporte para a tentativa de operação para o tipo de objeto referenciado. Esse erro será retornado se não houver suporte para o comando IOCTL especificado. Esse erro também será retornado se o SIO_LOOPBACK_FAST_PATH IOCTL não tiver suporte do provedor de transporte. |
Comentários
Um aplicativo pode usar o SIO_LOOPBACK_FAST_PATH IOCTL para reduzir a latência e melhorar o desempenho das operações de loopback em um soquete TCP. Esse IOCTL solicita que a pilha TCP/IP use um caminho rápido especial para operações de loopback nesse soquete. O SIO_LOOPBACK_FAST_PATH IOCTL só pode ser usado com soquetes TCP. Esse IOCTL deve ser usado em ambos os lados da sessão de loopback. O caminho rápido de loopback TCP tem suporte usando a interface de loopback IPv4 ou IPv6.
O soquete que planeja iniciar a solicitação de conexão deve aplicar esse IOCTL antes de fazer a solicitação de conexão. Portanto, o soquete usado pela função connect, ConnectEx, WSAConnect, WSAConnectByList ou WSAConnectByName para iniciar a conexão deve aplicar esse IOCTL para usar o caminho rápido para operações de loopback.
O soquete que está escutando a solicitação de conexão deve aplicar esse IOCTL antes de aceitar a conexão. Portanto, o soquete usado pela função listen deve aplicar esse IOCTL para que todos os soquetes aceitos usem o caminho rápido para loopback. Todos os soquetes retornados pela função listen e passados para a função accept, AcceptEx ou WSAAccept serão marcados para usar o caminho rápido especial para operações de loopback.
Depois que um aplicativo estabelece a conexão em uma interface de loopback usando o caminho rápido, todos os pacotes para o tempo de vida da conexão devem usar o caminho rápido.
Aplicar SIO_LOOPBACK_FAST_PATH a um soquete que será conectado a um caminho não loopback não terá efeito.
Essa otimização de loopback TCP resulta em pacotes que fluem pela TL (Camada de Transporte) em vez do loopback tradicional por meio da Camada de Rede. Essa otimização melhora a latência de pacotes de loopback. Depois que um aplicativo optar por uma configuração de nível de conexão para usar o caminho rápido de loopback, todos os pacotes seguirão o caminho de loopback. Para comunicações de loopback, o congestionamento e a queda de pacotes não são esperados. A noção de controle de congestionamento e entrega confiável no TCP será desnecessária. Isso, no entanto, não é verdadeiro para o controle de fluxo. Sem o controle de fluxo, o remetente pode sobrecarregar o buffer de recebimento, levando a um comportamento de loopback TCP incorreto. O controle de fluxo no caminho de loopback otimizado para TCP é mantido colocando solicitações de envio em uma fila. Quando o buffer de recebimento está cheio, a pilha TCP/IP garante que os envios não serão concluídos até que a fila seja atendida mantendo o controle de fluxo.
As conexões de loopback de caminho rápido TCP na presença de um texto explicativo da Plataforma de Filtragem do Windows (WFP) para dados de conexão devem usar o caminho lento não otimizado para loopback. Portanto, os filtros WFP impedirão que esse novo caminho rápido de loopback seja usado. Quando um filtro WFP estiver habilitado, o sistema usaremos o caminho lento mesmo que o SIO_LOOPBACK_FAST_PATH IOCTL tenha sido definido. Isso garante que os aplicativos de modo de usuário tenham a funcionalidade de segurança completa do WFP.
Por padrão, SIO_LOOPBACK_FAST_PATH está desabilitado.
Há suporte apenas para um subconjunto das opções de soquete TCP/IP quando o SIO_LOOPBACK_FAST_PATH IOCTL é usado para habilitar o caminho rápido de loopback em um soquete. A lista de opções com suporte inclui o seguinte:
- IP_TTL
- IP_UNICAST_IF
- IPV6_UNICAST_HOPS
- IPV6_UNICAST_IF
- IPV6_V6ONLY
- SO_CONDITIONAL_ACCEPT
- SO_EXCLUSIVEADDRUSE
- SO_PORT_SCALABILITY
- SO_RCVBUF
- SO_REUSEADDR
- TCP_BSDURGENT