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.
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 |
---|---|
|
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 |
---|---|
|
O sistema remoto recusou a conexão de rede. |
|
O parâmetro QOSHandle é inválido. |
|
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 .
|
|
Falha na alocação de memória. |
|
Não há recursos suficientes para executar a operação. |
|
Não foi possível executar a solicitação devido a um erro de dispositivo de E/S. |
|
O dispositivo indicado exige a reinicialização devido a erros de hardware. O aplicativo deve limpo e chamar QOSCreateHandle novamente. |
|
A solicitação não terá suporte. |
|
Ocorreu um erro de hardware do adaptador de rede. |
|
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 |