Поделиться через


Функция QOSSetFlow (qos2.h)

Функция QOSSetFlow вызывается приложением для запроса подсистемы QOS для определения приоритета пакетов приложения и изменения потока трафика. Эта функция также используется для уведомления подсистемы QoS об изменении потока: например, если скорость потока изменяется с учетом перегрузки сети или если значение приоритета QoS требует корректировки для передачи или потоковой передачи различных типов содержимого через одно постоянное подключение сокета.

Синтаксис

ExternC BOOL QOSSetFlow(
  [in]            HANDLE       QOSHandle,
  [in]            QOS_FLOWID   FlowId,
  [in]            QOS_SET_FLOW Operation,
  [in]            ULONG        Size,
  [in]            PVOID        Buffer,
                  DWORD        Flags,
  [out, optional] LPOVERLAPPED Overlapped
);

Параметры

[in] QOSHandle

Дескриптор подсистемы QOS, возвращаемой QOSCreateHandle.

[in] FlowId

Идентификатор потока. QOS_FLOWID — это 32-разрядное целое число без знака.

[in] Operation

QOS_SET_FLOW перечислимый тип, определяющий, что будет изменено в потоке. Этот параметр указывает, какую структуру будет содержать буфер .

Значение Значение
QOSSetTrafficType
0
Тип трафика потока будет изменен. Буфер будет содержать указатель на константу QOS_TRAFFIC_TYPE.
QOSSetOutgoingRate
1
Скорость потока будет изменена. Буфер будет содержать указатель на структуру QOS_FLOWRATE_OUTGOING.
QOSSetOutgoingDSCPValue
2
Windows 7, Windows Server 2008 R2 и более поздних версий: исходящее значение DSCP будет изменено. Буфер будет содержать указатель на значение DWORD, определяющее произвольное значение DSCP.
Примечание Для этого параметра требуется, чтобы вызывающее приложение было членом группы "Администраторы" или "Операторы конфигурации сети".
 

[in] Size

Размер параметра Buffer в байтах.

[in] Buffer

Указатель на структуру, заданную значением параметра Operation .

Flags

Зарезервировано для последующего использования. Этот параметр должен иметь значение 0.

[out, optional] Overlapped

Указатель на структуру OVERLAPPED, используемую для асинхронного вывода. Если эта функция не вызывается асинхронно, ей необходимо присвоить значение NULL .

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция завершается сбоем, возвращаемое значение равно 0. Дополнительные сведения об ошибке можно получить, вызвав GetLastError. Ниже приведены некоторые возможные коды ошибок.

Код возврата Описание
ERROR_ACCESS_DISABLED_BY_POLICY
В настоящее время подсистема QoS настроена политикой, чтобы запретить эту операцию на сетевом пути между этим узлом и конечным узлом. Например, политика по умолчанию запрещает запуск экспериментов qWAVE в местах назначения вне канала.
ERROR_IO_PENDING
Запрос потока обновления успешно получен. Результаты будут возвращены во время перекрытия завершения.
ERROR_ACCESS_DENIED
Вызывающее приложение не имеет достаточных привилегий для запрошенной операции.
ERROR_INVALID_HANDLE
Недопустимый параметр QOSHandle .
ERROR_INVALID_PARAMETER
Недопустимый параметр FlowId .
ERROR_NETWORK_BUSY
Запрошенные свойства потока недоступны по этому пути.
ERROR_NOT_FOUND
Не удается найти указанный параметр FlowId .
ERROR_NOT_ENOUGH_MEMORY
Не удалось выделить память.
ERROR_NOT_SUPPORTED
Выполняемой операции требуются сведения, отсутствуют в подсистеме QoS. Получение этих сведений в этой сети в настоящее время не поддерживается. Например, оценки пропускной способности нельзя получить по сетевому пути, где конечный узел находится вне связи.
ERROR_NO_SYSTEM_RESOURCES
Недостаточно ресурсов для выполнения операции.
ERROR_IO_DEVICE
Выполнить запрос невозможно из-за ошибки устройства ввода-вывода.
ERROR_DEVICE_REINITIALIZATION_NEEDED
Указанное устройство требует повторной инициализации из-за ошибок оборудования. Приложение должно очиститься и снова вызвать QOSCreateHandle .
ERROR_ADAP_HDW_ERR
Произошла ошибка оборудования сетевого адаптера.
ERROR_HOST_UNREACHABLE
Не удается получить доступ к сетевому расположению.
ERROR_RETRY
В настоящее время недостаточно данных о сетевых условиях для ответа на запрос. Обычно это временное состояние, в котором qWAVE имеет ошибку на стороне осторожности, так как он ожидает больше данных, прежде чем определить состояние сети.
ERROR_UNEXP_NET_ERR
Сбой сетевого подключения к удаленному узлу.

Комментарии

Если QOSStartTrackingClient еще не был вызван, вызов QOSSetFlow приведет к тому, что подсистема QOS выполнит следующие действия.

  • Узнайте, поддерживает ли сквозной сетевой путь определение приоритетов.
  • Отслеживайте комплексные характеристики сети с помощью сетевых экспериментов. Эти эксперименты не примечают к сети.

Если функция QOSSetFlow возвращает ERROR_NETWORK_BUSY для указанной скорости потока недостаточно пропускной способности и не удается предоставить приоритет сети. Приложение по-прежнему может передавать поток данных, но поток не получит маркировку приоритета. В идеале приложение не будет пытаться выполнить потоковую передачу по запрошенной скорости, если пропускная способность недостаточна. Если возвращается ERROR_NETWORK_BUSY , доступна следующая безопасная стратегия:

  1. Запросите подсистему QoS с помощью QOSNotifyFlow , чтобы определить текущую доступную пропускную способность и начать потоковую передачу с более низкой скоростью с приоритетом, если сеть поддерживает ее.
  2. Запросите уведомление с помощью QOSNotifyFlow о доступности первоначально требуемой пропускной способности. При получении уведомления вызовите QOSSetFlow с новым запросом пропускной способности и отправьте по новой скорости еще раз с определением приоритетов, если это поддерживается.

Эта функция может быть вызвана асинхронно.

Примеры

В следующем фрагменте кода показано использование QOSSetFlow в приложении. Входные параметры QOSHandle, FlowId, FlowId, QOSSetOutgoingRate и sizeof(QoSOutgoingFlowrate) должны быть ранее инициализированы другими функциями качества обслуживания и вычислениями в приложении.

Другие примеры функций QoS, демонстрирующие инициализацию параметров, включают QOSCreateHandle, QOSAddSocketToFlow и QOSQueryFlow.

Полный список примеров кода см. в пакете Windows SDK. Папка пакета SDK: Samples\NetDs\GQos\Qos2

if( QOSSetFlow( QOSHandle,
        FlowId,
        QOSSetOutgoingRate,           // Operation 
        sizeof(QoSOutgoingFlowrate),  // Size
        &QoSOutgoingFlowrate,         // Buffer
        0,                            // Flags (Must be set to 0 with QoS Version 1.0)
        NULL)                         // Overlapped
        == 0 )
{
    if( ERROR_INVALID_PARAMETER == GetLastError())
    {
        std::cerr << __FILE__ <<" Line: " << __LINE__ ;
        std::cerr << " - QOSSetFlow failed. Exception code: "; 
        std::cerr << GetLastError() << " - Invalid parameter"; 
        std::cerr << std::endl;
    }
    else
    {
        std::cerr << __FILE__ <<" Line: " << __LINE__ ;
        std::cerr << " - QOSSetFlow failed. Exception code: "; 
        std::cerr << GetLastError() << std::endl;
    }
    
}
else
{
    std::cout << "QOSSetFlow set outgoing flowrate bandwidth to "; 
    std::cout << QoSOutgoingFlowrate.Bandwidth;
    std::cerr << std::endl;
}


Требования

   
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header qos2.h (включая Qos2.h)
Библиотека Qwave.lib
DLL Qwave.dll

См. также раздел

Качество звука и видео Windows (qWAVE)