Compartilhar via


código de controle SIO_IDEAL_SEND_BACKLOG_QUERY

Descrição

O código de controle SIO_IDEAL_SEND_BACKLOG_QUERY recupera o valor de ISB (lista de pendências de envio) ideal para a conexão subjacente.

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_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  (LPVOID) lpvOutBuffer,         // 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_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  (LPVOID) lpvOutBuffer,         // 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 para a operação. Use SIO_IDEAL_SEND_BACKLOG_QUERY para esta operação.

Lpvinbuffer

Um ponteiro para o buffer de entrada. Esse parâmetro não é usado para essa operação.

Cbinbuffer

O tamanho, em bytes, do buffer de entrada. Esse parâmetro não é usado para essa operação.

Lpvoutbuffer

Um ponteiro para o buffer de saída. Esse parâmetro deve apontar para um tipo de dados ULONG se os parâmetros lpOverlapped e lpCompletionRoutine forem NULL.

cbOutBuffer

O tamanho, em bytes, do buffer de saída. Esse parâmetro deve ter pelo menos o tamanho de um tipo de dados ULONG .

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 podem 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. O status de conclusão final pode ser recuperado quando o método de conclusão apropriado é sinalizado quando a operação é concluída.

lpvOverlapped

Um ponteiro para uma estrutura WSAOVERLAPPED .

Se 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 Uma operação sobreposta foi iniciada com êxito e a conclusão será indicada posteriormente.
WSA_OPERATION_ABORTED Uma operação sobreposta foi cancelada devido ao fechamento do soquete ou à execução do comando IOCTL SIO_FLUSH .
WSAEFAULT O 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 A função é invocada quando um retorno de chamada está em andamento.
WSAEINTR Uma operação de bloqueio foi interrompida.
WSAEINVAL O parâmetro dwIoControlCode não é um comando válido ou um parâmetro de entrada especificado não é aceitável ou o comando não é aplicável ao tipo de soquete especificado. Esse erro será retornado se o parâmetro cbOutBuffer for menor que o tamanho de um tipo de dados ULONG .
WSAENETDOWN O subsistema de rede falhou.
WSAENOPROTOOPT Não há suporte para a opção de soquete no protocolo especificado.
WSAENOTCONN O soquete s não está conectado.
WSAENOTSOCK O descritor s não é um soquete.
WSAEOPNOTSUPP Não há suporte para o comando IOCTL especificado. Esse erro será retornado se o SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL não tiver suporte do provedor de transporte. Esse erro também é retornado quando uma tentativa de usar o SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL é feita em um soquete de datagrama.

Comentários

O SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL tem suporte no Windows Server 2008, no Windows Vista com o Service Pack 1 (SP1) e nas versões posteriores do sistema operacional.

Ao enviar dados por uma conexão TCP usando soquetes do Windows, é importante manter uma quantidade suficiente de dados pendentes (enviados, mas ainda não confirmados) no TCP para obter a maior taxa de transferência. O valor ideal para a quantidade de dados pendentes para obter a melhor taxa de transferência para a conexão TCP é chamado de tamanho de ISB (lista de pendências de envio ideal). O valor ISB é uma função do produto de atraso de largura de banda da conexão TCP e da janela de recebimento anunciada do receptor (e, em parte, a quantidade de congestionamento na rede).

O valor ISB por conexão está disponível na implementação do protocolo TCP no Windows Server 2008, windows Vista com SP1 e versões posteriores do sistema operacional. O SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL pode ser usado por um aplicativo para receber uma notificação quando o valor do ISB for alterado dinamicamente para uma conexão.

No Windows Server 2008, windows Vista com SP1 e versões posteriores do sistema operacional, os IOCTLs SIO_IDEAL_SEND_BACKLOG_CHANGE e SIO_IDEAL_SEND_BACKLOG_QUERY têm suporte em soquetes orientados a fluxo que estão em um estado conectado.

O intervalo para o valor ISB de uma conexão TCP pode teoricamente variar de 0 a um máximo de 16 megabytes.

O uso típico do SIO_IDEAL_SEND_BACKLOG_CHANGE e SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs baseia-se no método de envio usado pelos aplicativos. Dois casos comuns são discutidos.

Os aplicativos que executam uma solicitação de envio de bloqueio ou não bloqueio por vez normalmente dependem do buffer de envio interno do Winsock para obter uma taxa de transferência decente. O limite de buffer de envio para uma determinada conexão é controlado pela opção de soquete SO_SNDBUF . Para o método de envio de bloqueio e não bloqueio, o limite de buffer de envio determina quantos dados são mantidos pendentes no TCP. Se o valor ISB da conexão for maior que o limite de buffer de envio, a taxa de transferência obtida na conexão não será ideal. Para obter uma melhor taxa de transferência, os aplicativos podem definir o limite de buffer de envio com base no resultado da consulta ISB à medida que as notificações de alteração do ISB ocorrem na conexão.

Para aplicativos que usam o método send sobreposto com várias solicitações de envio pendentes, a quantidade de dados mantidos pendentes no TCP é determinada pelo limite de buffer de envio em Winsock e pela quantidade total de dados contidos nas solicitações de envio sobrepostas pendentes. Nesse caso, os aplicativos devem usar o valor ISB para determinar quantas solicitações de envio pendentes devem ser mantidas e qual deve ser o tamanho dos dados para cada solicitação de envio. O ideal é que o aplicativo tente manter a seguinte equação atendida:

ISB value == send buffer limit + (number of simultaneous overlapped send requests * data length per send request)

Observe que o uso das IOCTLs isb sobre soquetes TCP da forma acima pode levar a um aumento do uso de memória em troca de maior taxa de transferência em conexões com um produto de alta largura de banda. A implementação do TCP no Windows limitará os valores isb conforme necessário com base no uso geral da memória do sistema.

O SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL é permitido somente em um soquete de fluxo que está no estado conectado. Caso contrário, a função WSAIoctl ou WSPIoctl falhará com WSAENOTCONN.

Qualquer IOCTL pode bloquear indefinidamente, dependendo da implementação do provedor de serviços. Se o aplicativo não puder tolerar o bloqueio em uma chamada de função WSAIoctl ou WSPIoctl , a E/S sobreposta será aconselhada para IOCTLs que são especialmente propensas a bloquear.

A SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL não é provável que seja bloqueada, portanto, normalmente é chamada de forma síncrona com os parâmetros lpOverlapped e lpCompletionRoutine definidos como NULL.

O SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL pode falhar com WSAEINTR ou WSA_OPERATION_ABORTED nos seguintes casos:

A conexão TCP é normalmente desconectada na direção de envio. Isso pode ocorrer como resultado de uma chamada para a função de desligamento com o parâmetro how definido como SD_SEND, uma chamada para a função DisconnectEx ou uma chamada para a função TransmitFile ou TransmitPackets com o parâmetro dwFlags definido como TF_DISCONNECT ou TF_REUSE. A conexão TCP foi redefinida ou anulada. A solicitação é cancelada pelo Gerenciador de E/S.

Duas funções de wrapper embutidas para essas IOCTLs são definidas no arquivo de cabeçalho Ws2tcpip.h . É recomendável que essas funções embutidas sejam usadas em vez de usar os IOCTLs SIO_IDEAL_SEND_BACKLOG_CHANGE e SIO_IDEAL_SEND_BACKLOG_QUERY diretamente.

A função wrapper embutida do SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL é a função idealsendbacklognotify .

A função wrapper embutida do SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL é a função idealsendbacklogquery .

O buffer de envio dinâmico para TCP foi adicionado no Windows 7 e no Windows Server 2008 R2. Por padrão, o buffer de envio dinâmico para TCP está habilitado, a menos que um aplicativo defina a opção de soquete SO_SNDBUF no soquete de fluxo.

Usar netsh é o método recomendado para consultar ou definir o buffer de envio dinâmico para TCP.

O valor atual do buffer de envio dinâmico para TCP pode ser recuperado usando o seguinte comando:

netsh winsock show autotuning

O buffer de envio dinâmico para TCP pode ser desabilitado usando o seguinte comando:

netsh winsock set autotuning off

O buffer de envio dinâmico para TCP pode ser habilitado usando o seguinte comando:

netsh winsock set autotuning on

Embora não seja recomendável, o buffer de envio dinâmico pode ser desabilitado de um aplicativo definindo o seguinte valor do Registro como zero:

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\AFD\Parameters\DynamicSendBufferDisable

Ao alterar o valor do buffer de envio dinâmico usando NetSh.exe ou alterar o valor do Registro, o computador deve ser reiniciado para que a alteração entre em vigor.

Com o buffer de envio dinâmico no Windows 7 e no Windows Server 2008 R2, o uso do SIO_IDEAL_SEND_BACKLOG_CHANGE e SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs são necessários apenas em circunstâncias especiais.

Confira também

SIO_IDEAL_SEND_BACKLOG_CHANGE

soquete

Wsagetlasterror

Wsagetoverlappedresult

Wsaioctl

WSAOVERLAPPED

WSASocketA

WSASocketW