QOSAddSocketToFlow返回错误 - 未找到ELEMENT

时间:2016-09-21 06:48:48

标签: winapi networking packets

我正在使用QWAVE API在数据包中设置DSCP值。

我正在尝试进行多次调用,DSCP位在服务器和客户端之间设置为46。

对于每次调用,我必须在QOS流程中添加套接字,由QOSAddSocketToFlow完成。

当某些调用的DSCP位未正确设置时出现问题。

此外,我发现对于那些调用QOSAddSocketToFlow API返回错误代码:

  

未找到元素

此错误在MSDN site

上指定为可能的返回代码

我使用的是QOS_NON_ADAPTIVE_FLOW,流量类型为QOSTrafficTypeBestEffort

QoSResult = QOSAddSocketToFlow(
     QoSHandle,
     ConnectSocket,
     sockaddr,
     QOSTrafficTypeExcellentEffort, 
      QOS_NON_ADAPTIVE_FLOW, 
     &FlowId);

我想了解QOSAddSocketToFlow可以抛出此错误代码的情况。此外,所有调用都没有发生这种情况,一些随机调用正在收到此错误。

1 个答案:

答案 0 :(得分:0)

我认为我的团队已经解决了这个问题。

我们将C#中的QWave API与自定义编写的pinvoke库一起使用,以便我们在单播udp,单播tcp和多播udp套接字上测试DSCP风格的QOS,我们也开始从QosAddSocketToFlow看到ELEMENT_NOT_FOUND错误。

QosAddSocketToFlow大部分时间都可以工作,但是在某些情况下,我们得到了错误。

事实证明,QosAddSocketToFlow要求您首先将套接字绑定到真实源地址或INADDR_ANY。

在破损的代码中,我们首先添加了qos:

if( this.dscpCodePoint != null && this.dscpCodePoint > 0 )
{
    ApplyQosCodePoint( this.dscpCodePoint.Value );
}

this.socket.Bind( new IPEndPoint( this.sourceAddress, this.sourcePort ) );

尽管这通常可以正常工作,但它经常会导致多播套接字抛出ELEMENT_NOT_FOUND错误。我们只需切换语句的顺序,错误就会消失:

this.socket.Bind( new IPEndPoint( this.sourceAddress, this.sourcePort ) );

if( this.dscpCodePoint != null && this.dscpCodePoint > 0 )
{
    ApplyQosCodePoint( this.dscpCodePoint.Value );
}