我正在使用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
可以抛出此错误代码的情况。此外,所有调用都没有发生这种情况,一些随机调用正在收到此错误。
答案 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 );
}