Partilhar via


Função QOSAddSocketToFlow (qos2.h)

A função QOSAddSocketToFlow adiciona um novo fluxo para o tráfego.

Sintaxe

ExternC BOOL QOSAddSocketToFlow(
  [in]           HANDLE           QOSHandle,
  [in]           SOCKET           Socket,
  [in, optional] PSOCKADDR        DestAddr,
  [in]           QOS_TRAFFIC_TYPE TrafficType,
  [in, optional] DWORD            Flags,
  [in, out]      PQOS_FLOWID      FlowId
);

Parâmetros

[in] QOSHandle

Manipule para o subsistema QOS retornado por QOSCreateHandle.

[in] Socket

Identifica o soquete que o aplicativo usará para fluir o tráfego.

[in, optional] DestAddr

Ponteiro para uma estrutura sockaddr que contém o endereço IP de destino para o qual o aplicativo enviará tráfego. A estrutura sockaddr deve especificar uma porta de destino.

ObservaçãoDestAddr será opcional se o soquete já estiver conectado. Se esse parâmetro for especificado, o endereço IP remoto e a porta deverão corresponder aos usados na chamada de conexão do soquete.

Se o soquete não estiver conectado, esse parâmetro deverá ser especificado. Se o soquete já estiver conectado, esse parâmetro não precisará ser especificado. Nesse caso, se o parâmetro ainda for especificado, o host de destino e a porta deverão corresponder ao que foi especificado durante a chamada de conexão de soquete.

Como, em TCP, a chamada de conexão de soquete pode ser atrasada, QOSAddSocketToFlow pode ser chamado antes que uma conexão seja estabelecida, passando o endereço IP do sistema remoto e o número da porta no parâmetro DestAddr .

 

[in] TrafficType

Uma constante QOS_TRAFFIC_TYPE que especifica o tipo de tráfego para o qual esse fluxo será usado.

[in, optional] Flags

Valores de sinalizador opcionais.

Valor Significado
QOS_NON_ADAPTIVE_FLOW
Se especificado, o subsistema QoS não coletará dados sobre o caminho de rede para esse fluxo. Como resultado, funções que dependem de técnicas de estimativa de largura de banda não estarão disponíveis. Por exemplo, isso bloquearia QOSQueryFlow com um valor de Operação de QOSQueryFlowFundamentals e QOSNotifyFlow com um valor operation de QOSNotifyCongested, QOSNotifyUncongested e QOSNotifyAvailable.

[in, out] FlowId

Ponteiro para um buffer que recebe um identificador de fluxo. Na entrada, esse valor deve ser 0. Na saída, o buffer conterá um identificador de fluxo se a chamada for bem-sucedida.

Se um soquete estiver sendo adicionado a um fluxo existente, esse parâmetro será o identificador desse fluxo.

Um aplicativo poderá usar esse parâmetro se vários soquetes usados puderem compartilhar as mesmas propriedades de fluxo de QoS. O subsistema QoS não precisa incorrer na sobrecarga de provisionamento de novos fluxos para soquetes subsequentes com as mesmas propriedades. Observe que apenas fluxos não adaptáveis podem ter vários soquetes anexados a um fluxo existente.

Um QOS_FLOWID é um inteiro sem sinal de 32 bits.

Valor retornado

Se a função for bem-sucedida, o valor retornado será diferente de zero.

Se a função falhar, o valor retornado será 0. Para obter informações de erro estendidas, chame GetLastError. Alguns códigos de erro possíveis seguem.

Código de retorno Descrição
ERROR_CONNECTION_REFUSED
O sistema remoto recusou a conexão de rede.
ERROR_INVALID_HANDLE
O parâmetro QOSHandle é inválido.
ERROR_INVALID_PARAMETER
O parâmetro FlowId é inválido.
Nota Esse valor também será retornado se um endereço misto IPv4/v6 for fornecido por meio do parâmetro DestAddr .
 
ERROR_NOT_ENOUGH_MEMORY
Falha na alocação de memória.
ERROR_NO_SYSTEM_RESOURCES
Não há recursos suficientes para executar a operação.
ERROR_IO_DEVICE
Não foi possível executar a solicitação devido a um erro de dispositivo de E/S.
ERROR_DEVICE_REINITIALIZATION_NEEDED
O dispositivo indicado exige a reinicialização devido a erros de hardware. O aplicativo deve limpo e chamar QOSCreateHandle novamente.
ERROR_NOT_SUPPORTED
A solicitação não terá suporte.
ERROR_ADAP_HDW_ERR
Ocorreu um erro de hardware do adaptador de rede.
ERROR_HOST_UNREACHABLE
Não é possível acessar o local de rede.

Comentários

Não há suporte para o uso de endereços mistos IPv4/v6 no qWAVE. O endereço especificado pelo parâmetro DestAddr deve ser IPv4 ou IPv6.

Se houver um requisito para experimentos de rede em um adaptador de rede específico, o soquete deverá estar associado a essa interface específica. Caso contrário, a interface mais apropriada para o experimento, conforme indicado pela pilha de rede, é atribuída pelo subsistema qWAVE.

O tráfego de rede associado a esse fluxo não é afetado por fazer essa chamada sozinho. Por exemplo, a priorização de pacotes não ocorre imediatamente.

Há duas categorias de aplicativos que usam essa função: adaptável e não adaptável. Um aplicativo adaptável usa notificações e informações na estrutura QOS_FLOW_FUNDAMENTALS para se adaptar a alterações de rede, como congestionamento. O serviço qWAVE usa extensões de QoS da LLTD (Descoberta de Topologia de Camada de Link) para fluxos adaptáveis que podem estar presentes no dispositivo de destino.

Depois de chamar essa função, aplicativos A/V adaptáveis devem chamar a função QOSSetFlow com um valor de Operaçãode QOSSetFlowRate para afetar o tráfego de rede.

Um aplicativo não adaptável não se adapta à alteração das características de rede ou está enviando tráfego para um ponto de extremidade que não dá suporte a recursos adaptáveis, conforme indicado por ERROR_NOT_SUPPORTED.

Aplicativos não adaptáveis ou aplicativos adaptáveis que fazem fluxos não adaptáveis devem chamar essa função com o sinalizador QOS_NON_ADAPTIVE_FLOW . Depois de chamar essa função, os aplicativos A/V devem chamar a função QOSSetFlow com uma Operação. O QOSSetFlow não precisa ser chamado, a menos que a formatação seja desejada.

Exemplos

O código a seguir ilustra o uso de QOSAddSocketFromFlow. A função QOSCreateHandle também é mostrada para fornecer informações sobre a inicialização de parâmetros usados por QOSAddSocketFromFlow.

Consulte o SDK do Windows para obter uma listagem de código de exemplo completa. Pasta do SDK: Samples\NetDs\GQos\Qos2

O arquivo de cabeçalho Winsock2.h deve ser incluído para usar WSAGetLastError e outras funções Winsock.

QOS_VERSION    Version;
HANDLE         QoSHandle = NULL;
QOS_FLOWID     QoSFlowId = 0; // Flow Id must be 0.
SOCKET        ConnectionSocket;
BOOL          QoSResult;


// Initialize the QoS version parameter.
Version.MajorVersion = 1;
Version.MinorVersion = 0;

// Get a handle to the QoS subsystem.
QoSResult = QOSCreateHandle(
    &Version, 
    &QoSHandle );

if (QoSResult != TRUE)
{
    std::cerr << "QOSCreateHandle failed. Error: "; 
    std::cerr << WSAGetLastError() << std::endl;
}

// Initialization of ConnectionSocket   
// omitted for brevity, but is needed.
/////////////////////////////////////
 
// Add socket to flow.
QoSResult = QOSAddSocketToFlow(
    QoSHandle,
    ConnectionSocket,
    NULL,
    QOSTrafficTypeExcellentEffort, 
     QOS_NON_ADAPTIVE_FLOW, 
    &QoSFlowId);

if (QoSResult != TRUE)
{
    std::cerr << "QOSAddSocketToFlow failed. Error: "; 
    std::cerr << WSAGetLastError() << std::endl;
}


Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho qos2.h (inclua Qos2.h)
Biblioteca Qwave.lib
DLL Qwave.dll

Confira também

QOSCreateHandle

Experiência de áudio/vídeo do Windows de qualidade (qWAVE)