QOSSetFlow API成功,但Windows 2016 Server OS VM上未应用Dscp值

时间:2018-10-11 22:36:41

标签: windows winapi windows-server-2016 qos

在win2k16 VM上,我尝试使用QoS2 API以编程方式设置任意Dscp值。

Qwave角色(从服务器管理器安装了高质量的音频视频体验)。

相同的代码(请在下面找到)-适用于Windows 10 VM,但不适用于Windows 2016 VM。所有API都返回成功,但是当我检查Wireshark时,Dscp值设置为“零”。

我的代码大致如下:

1. Step 1: LoadLibrary(qwave.dll)
2. Step 2: GetProcAddress - QOSCreateHandle, QOSAddSocketToFlow, QOSSetFlow, QOSRemoveSocketFromFlow, QOSCloseHandle
3. Step 3: Use QWave APIs to set Dscp (code below)

int SetDscpWithQWave(SOCKET           fd, // Accepted SOCKET fd
                     struct sockaddr *remoteAddr,
                     int              dscpValueToSet) 
{
   Bool ret = FALSE;

   QOS_VERSION version;
   DWORD priority;
   HANDLE qwaveQoSHandle = NULL;
   QOS_FLOWID qwaveQoSFlowID = 0;

   // Initialize the QoS version parameter
   version.MajorVersion = 1;
   version.MinorVersion = 0;

   ret = qwaveQoSCreateHandleFn(&version, &qwaveQoSHandle);
   if (!ret) {
      Warning("QOSCreateHandle failed to create handle with error %d\n", GetLastError());
      return ret;
   }

   ret = qwaveQoSAddSocketToFlowFn(qwaveQoSHandle,
                                   fd,
                                   remoteAddr,
                                   QOSTrafficTypeExcellentEffort,
                                   QOS_NON_ADAPTIVE_FLOW,
                                   &qwaveQoSFlowID);
   if (!ret) {
      Warning("QOSAddSocketToFlow failed to add a flow with error %d\n", GetLastError());
      return ret;
   }

   priority = dscpValueToSet;
   ret =qwaveQoSSetFlowFn(qwaveQoSHandle,
                          qwaveQoSFlowID,
                          QOSSetOutgoingDSCPValue,
                          sizeof(priority),
                          &priority,
                          0,
                          NULL);
   if (!ret) {
      Warning("QOSSetFlow failed to add a flow with error %d\n",
              GetLastError());
      return ret;
   }

   return ret;
}
  • 相同的代码可在Windows 10 VM上使用-Dscp值可以很好地设置。
  • 在Win2016 VM上-所有QOS API调用均成功。但是,如果我检查Wireshark,则Dscp值将设置为“零”。
  • 我没有加载“ qwave.dll”,而是尝试在qwave.lib中进行静态链接并直接调用QOS *函数-幸运的是,同样的观察。

我在这里缺少明显的东西吗?

相同的代码可以在Windows10 VM上运行但不能在Win2k16 VM上运行的事实使我觉得我缺少一些配置-但在MSDN文档中找不到任何内容。

谢谢!

0 个答案:

没有答案