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 將包含哪些結構。
值 | 意義 |
---|---|
|
流程的流量類型將會變更。 Buffer將包含QOS_TRAFFIC_TYPE常數的指標。 |
|
流量速率將會變更。 Buffer將包含QOS_FLOWRATE_OUTGOING結構的指標。 |
|
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。 接下來有一些可能的錯誤碼。
傳回碼 | 描述 |
---|---|
|
QoS 子系統目前由原則設定,不允許此主機與目的地主機之間的網路路徑上執行此作業。 例如,預設原則可防止 qWAVE 實驗執行到離連結目的地。 |
|
已成功收到更新流程要求。 結果會在重迭完成期間傳回。 |
|
呼叫的應用程式沒有足夠的許可權可用於要求的作業。 |
|
QOSHandle參數無效。 |
|
FlowId參數無效。 |
|
此路徑上無法使用要求的流程屬性。 |
|
找不到指定的 FlowId 參數。 |
|
記憶體配置失敗。 |
|
正在執行的作業需要 QoS 子系統沒有的資訊。 目前不支援在此網路上取得這項資訊。 例如,無法在目的地主機關閉連結的網路路徑上取得頻寬估計。 |
|
資源不足,無法執行作業。 |
|
因為 I/O 裝置錯誤,所以無法執行要求。 |
|
指定的裝置因為硬體錯誤而需要重新初始化。 應用程式應該會再次清除並呼叫 QOSCreateHandle 。 |
|
發生網路介面卡硬體錯誤。 |
|
無法連線到網路位置。 |
|
目前網路狀況的資料不足,無法回應查詢。 這通常是暫時性狀態,當 qWAVE 在確定網路狀態之前等候更多資料時,qWAVE 會小心側邊。 |
|
與遠端主機的網路連線失敗。 |
備註
如果尚未呼叫 QOSStartTrackingClient ,呼叫 QOSSetFlow 會導致 QOS 子系統執行下列動作。
- 探索端對端網路路徑是否支援優先順序。
- 透過網路實驗來追蹤端對端網路特性。 這些實驗不會對網路有任何值得注意的壓力。
如果 QOSSetFlow 傳回 ERROR_NETWORK_BUSY 指定的流量速率頻寬不足,且無法授與網路優先順序。 應用程式仍然可以傳輸資料流程,但流程不會收到優先順序標記。 在理想情況下,如果頻寬不足,應用程式就不會嘗試以所要求的速率進行串流。 如果 傳回ERROR_NETWORK_BUSY ,可以使用下列安全性原則:
- 使用 QOSNotifyFlow 查詢 QoS 子系統,以判斷目前的可用頻寬,並在網路支援時,以較低速率開始串流。
- 當原始所需的頻寬數量可供使用時,請向 QOSNotifyFlow 要求通知。 收到通知時,呼叫具有新頻寬要求的 QOSSetFlow ,並在支援時以優先順序再次傳送。
此函式可以選擇性地以非同步方式呼叫。
範例
下列程式碼片段示範如何在應用程式中使用 QOSSetFlow。 輸入參數 QOSHandle、 FlowId、 FlowId、 QOSSetOutgoingRate和 sizeof (QoSOutgoingFlowrate) 之前必須由應用程式內的其他 QoS 函式和計算初始化。
顯示參數初始化的其他 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 |
標頭 | qos2.h (包含 Qos2.h) |
程式庫 | Qwave.lib |
Dll | Qwave.dll |