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 子系统将不会收集有关此流的网络路径的数据。 因此,依赖于带宽估计技术的函数将不可用。 例如,这将阻止操作值为 QOSQueryFlowFundamentals 的 QOSQueryFlow,以及操作值为 QOSNotifyCongestedQOSNotifyUncongestedQOSNotifyAvailable 的 QOSNotifyFlow

[in, out] FlowId

指向接收流标识符的缓冲区的指针。 输入时,此值必须为 0。 在输出中,如果调用成功,缓冲区将包含流标识符。

如果将套接字添加到现有流,则此参数将是该流的标识符。

如果使用的多个套接字可以共享相同的 QoS 流属性,则应用程序可以使用此参数。 然后,QoS 子系统不必为具有相同属性的后续套接字预配新流而产生开销。 请注意,只有非自适应流才能将多个套接字附加到现有流。

QOS_FLOWID是无符号 32 位整数。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,返回值为 0。 要获得更多的错误信息,请调用 GetLastError。 下面是一些可能的错误代码。

返回代码 说明
ERROR_CONNECTION_REFUSED
远程系统拒绝了网络连接。
ERROR_INVALID_HANDLE
QOSHandle 参数无效。
ERROR_INVALID_PARAMETER
FlowId 参数无效。
注意 如果通过 DestAddr 参数提供 IPv4/v6 混合地址,也会返回此值。
 
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 应用程序应调用操作值为 QOSSetFlowRateQOSSetFlow 函数,以影响网络流量。

非自适应应用程序要么无法适应不断变化的网络特征,要么将流量发送到不支持自适应功能的终结点,如ERROR_NOT_SUPPORTED所示。

非自适应应用程序或生成非自适应流的自适应应用程序应使用 QOS_NON_ADAPTIVE_FLOW 标志调用此函数。 调用此函数后,A/V 应用程序应使用 Operation 调用 QOSSetFlow 函数。 除非需要调整,否则不需要调用 QOSSetFlow

示例

以下代码演示如何使用 QOSAddSocketFromFlowQOSCreateHandle 函数还会显示,用于提供有关 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)
Library Qwave.lib
DLL Qwave.dll

另请参阅

QOSCreateHandle

质量 Windows 音频/视频体验 (qWAVE)