共用方式為


QOSAddSocketToFlow 函式 (qos2.h)

QOSAddSocketToFlow 函式會新增流量的新流程。

語法

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
);

參數

[in] QOSHandle

QOSCreateHandle 所傳回之 QOS 子系統的句柄。

[in] Socket

識別應用程式將用來流動流量的套接字。

[in, optional] DestAddr

sockaddr 結構的指標,其中包含應用程式將傳送流量的目標IP位址。 sockaddr 結構必須指定目的地埠。

注意 如果套接字已經連接,DestAddr 是選擇性的。 如果指定此參數,遠端IP位址和埠必須符合套接字聯機呼叫中使用的位址。

如果未連接套接字,則必須指定此參數。 如果套接字已經連接,則不需要指定此參數。 在此情況下,如果仍然指定 參數,目的地主機和埠必須符合套接字連接呼叫期間所指定的內容。

由於在 TCP 下,套接字連線呼叫可能會延遲,因此可以在建立連線之前呼叫 QOSAddSocketToFlow ,並在 DestAddr 參數中傳入遠端系統的 IP 位址和埠號碼。

 

[in] TrafficType

QOS_TRAFFIC_TYPE常數,指定將使用此流程的流量類型。

[in, optional] Flags

選擇性旗標值。

意義
QOS_NON_ADAPTIVE_FLOW
如果指定,QoS 子系統將不會收集此流程網路路徑的相關數據。 因此,將無法使用依賴頻寬估計技術的函式。 例如,這會封鎖 QOSQueryFlow,其作業值為 QOSQueryFlowFundamentalsQOSNotifyFlow,其 Operation 值為 QOSNotifyCongested、QOSNotifyUncongestedQOSNotifyAvailable

[in, out] FlowId

接收流量標識碼之緩衝區的指標。 在輸入時,此值必須是 0。 在輸出中,如果呼叫成功,緩衝區就會包含流程標識符。

如果將套接字新增至現有的流程,此參數將會是該流程的標識碼。

如果使用多個套接字可以共用相同的 QoS 流程屬性,應用程式就可以使用此參數。 然後 QoS 子系統不需要為具有相同屬性的後續套接字布建新流程產生額外負荷。 請注意,只有非調適型流程可以有多個套接字連結至現有的流程。

QOS_FLOWID為不帶正負號的32位整數。

傳回值

如果函式成功,則傳回非零的值。

如果函式失敗,則傳回值為 0。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。 接下來有一些可能的錯誤碼。

傳回碼 Description
ERROR_CONNECTION_REFUSED
遠端系統拒絕網路連線。
ERROR_INVALID_HANDLE
QOSHandle 參數無效。
ERROR_INVALID_PARAMETER
FlowId 參數無效。
注意 如果 IPv4/v6 混合位址是透過 DestAddr 參數提供,也會傳回此值。
 
ERROR_NOT_ENOUGH_MEMORY
記憶體配置失敗。
ERROR_NO_SYSTEM_RESOURCES
資源不足,無法執行作業。
ERROR_IO_DEVICE
因為 I/O 裝置錯誤,所以無法執行要求。
ERROR_DEVICE_REINITIALIZATION_NEEDED
指定的裝置因為硬體錯誤而需要重新初始化。 應用程式應該會再次清除並呼叫 QOSCreateHandle
ERROR_NOT_SUPPORTED
不支援此要求。
ERROR_ADAP_HDW_ERR
發生網路適配器硬體錯誤。
ERROR_HOST_UNREACHABLE
無法連線到網路位置。

備註

qWAVE 不支援使用 IPv4/v6 混合位址。 DestAddr 參數指定的位址必須是 IPv4 或 IPv6。

如果透過特定網路介面進行網路實驗的需求,套接字必須系結至該特定介面。 否則,實驗最適合的介面,如網路堆疊所指示,是由 qWAVE 子系統指派。

與此流程相關聯的網路流量不會受到單獨進行此呼叫所影響。 例如,封包優先順序不會立即發生。

有兩種使用此函式的應用程式類別:自適性和非自適性。 調適型應用程式會使用 QOS_FLOW_FUNDAMENTALS 結構中的通知和資訊,以適應網路變更,例如壅塞。 qWAVE 服務會使用連結層拓撲探索 (LLTD) QoS 擴充功能,適用於可在目的地裝置上存在的調適型流程。

呼叫此函式自適性 A/V 應用程式之後,應該使用 QOSSetFlowRate的 Operation 值呼叫 QOSSetFlow 函式,以影響網路流量。

非自適性應用程式無法適應變更的網路特性,或將流量傳送至不支援自適性功能的端點,如ERROR_NOT_SUPPORTED所示。

非自適性應用程式或發出非調適型流程的調適型應用程式,應該使用 QOS_NON_ADAPTIVE_FLOW 旗標呼叫此函式。 呼叫此函式 A/V 應用程式之後,應該使用 Operation 呼叫 QOSSetFlow 函式。 除非需要成形,否則不需要呼叫 QOSSetFlow

範例

下列程式代碼說明 使用 QOSAddSocketFromFlow也會顯示 QOSCreateHandle 函式,以提供 QOSAddSocketFromFlow 所使用之參數初始化的相關信息。

如需完整的範例程式代碼清單,請參閱 Windows SDK。 SDK 資料夾:Samples\NetDs\GQos\Qos2

必須包含 Winsock2.h 頭檔,才能使用 WSAGetLastError 和其他 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;
}


規格需求

需求
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2008 [僅限傳統型應用程式]
目標平台 Windows
標頭 qos2.h (包含 Qos2.h)
程式庫 Qwave.lib
Dll Qwave.dll

另請參閱

QOSCreateHandle

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