共用方式為


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

QOSCreateHandle所傳回之 QOS 子系統的控制碼。

[in] FlowId

流程識別碼。 QOS_FLOWID為不帶正負號的 32 位整數。

[in] Operation

QOS_SET_FLOW列舉型別,可識別流程中將變更的專案。 此參數會指定 Buffer 將包含哪些結構。

意義
QOSSetTrafficType
0
流程的流量類型將會變更。 Buffer將包含QOS_TRAFFIC_TYPE常數的指標。
QOSSetOutgoingRate
1
流量速率將會變更。 Buffer將包含QOS_FLOWRATE_OUTGOING結構的指標。
QOSSetOutgoingDSCPValue
2
Windows 7、Windows Server 2008 R2 及更新版本:傳出 DSCP 值將會變更。 Buffer會包含定義任意 DSCP 值的DWORD值指標。
注意 此設定需要呼叫應用程式是 Administrators 或 Network Configuration Operators 群組的成員。
 

[in] Size

Buffer參數的大小,以位元組為單位。

[in] Buffer

Operation參數值所指定結構的指標。

Flags

保留供未來使用。 此參數必須設定為 0。

[out, optional] 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
因為 I/O 裝置錯誤,所以無法執行要求。
ERROR_DEVICE_REINITIALIZATION_NEEDED
指定的裝置因為硬體錯誤而需要重新初始化。 應用程式應該會再次清除並呼叫 QOSCreateHandle
ERROR_ADAP_HDW_ERR
發生網路介面卡硬體錯誤。
ERROR_HOST_UNREACHABLE
無法連線到網路位置。
ERROR_RETRY
目前網路狀況的資料不足,無法回應查詢。 這通常是暫時性狀態,當 qWAVE 在確定網路狀態之前等候更多資料時,qWAVE 會小心側邊。
ERROR_UNEXP_NET_ERR
與遠端主機的網路連線失敗。

備註

如果尚未呼叫 QOSStartTrackingClient ,呼叫 QOSSetFlow 會導致 QOS 子系統執行下列動作。

  • 探索端對端網路路徑是否支援優先順序。
  • 透過網路實驗來追蹤端對端網路特性。 這些實驗不會對網路有任何值得注意的壓力。

如果 QOSSetFlow 傳回 ERROR_NETWORK_BUSY 指定的流量速率頻寬不足,且無法授與網路優先順序。 應用程式仍然可以傳輸資料流程,但流程不會收到優先順序標記。 在理想情況下,如果頻寬不足,應用程式就不會嘗試以所要求的速率進行串流。 如果 傳回ERROR_NETWORK_BUSY ,可以使用下列安全性原則:

  1. 使用 QOSNotifyFlow 查詢 QoS 子系統,以判斷目前的可用頻寬,並在網路支援時,以較低速率開始串流。
  2. 當原始所需的頻寬數量可供使用時,請向 QOSNotifyFlow 要求通知。 收到通知時,呼叫具有新頻寬要求的 QOSSetFlow ,並在支援時以優先順序再次傳送。

此函式可以選擇性地以非同步方式呼叫。

範例

下列程式碼片段示範如何在應用程式中使用 QOSSetFlow。 輸入參數 QOSHandleFlowIdFlowIdQOSSetOutgoingRatesizeof (QoSOutgoingFlowrate) 之前必須由應用程式內的其他 QoS 函式和計算初始化。

顯示參數初始化的其他 QoS 函式範例包括 QOSCreateHandleQOSAddSocketToFlowQOSQueryFlow

如需完整的範例程式代碼清單,請參閱 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
標頭 qos2.h (包含 Qos2.h)
程式庫 Qwave.lib
Dll Qwave.dll

另請參閱

品質 Windows 音訊/視訊體驗 (qWAVE)