【问题标题】:PacketReceived/Sec value is very highPacketReceived/Sec 值非常高
【发布时间】:2013-11-26 19:11:41
【问题描述】:
class Win32_PerfRawData_Tcpip_NetworkInterface : Win32_PerfRawData
{
    uint32 BytesReceivedPerSec;
    uint32 BytesSentPerSec;
    uint64 BytesTotalPerSec;
    string Caption;
    uint32 CurrentBandwidth;
    string Description;
    uint64 Frequency_Object;
    uint64 Frequency_PerfTime;
    uint64 Frequency_Sys100NS;
    string Name;
    uint32 OutputQueueLength;
    uint32 PacketsOutboundDiscarded;
    uint32 PacketsOutboundErrors;
    uint32 PacketsPerSec;
    uint32 PacketsReceivedDiscarded;
    uint32 PacketsReceivedErrors;
    uint32 PacketsReceivedNonUnicastPerSec;
    uint32 PacketsReceivedPerSec;
    uint32 PacketsReceivedUnicastPerSec;
    uint32 PacketsReceivedUnknown;
    uint32 PacketsSentNonUnicastPerSec;
    uint32 PacketsSentPerSec;
    uint32 PacketsSentUnicastPerSec;
    uint64 Timestamp_Object;
    uint64 Timestamp_PerfTime;
    uint64 Timestamp_Sys100NS;
};

这个 WMI 类。

我得到 PacketReceived/sec 但它的值高于 120000。 我认为它每秒接收的字节数。 我得到了其他值和正确的

int WMIClass::ExcuteQuery(const char* cstr,LPWSTR atrb)
{
  hres = pSvc->ExecQuery(
    bstr_t("WQL"), 
    bstr_t(cstr),
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
    NULL,
    &pEnumerator);

   while (pEnumerator)
   {
    hres = pEnumerator->Next(WBEM_INFINITE, 1, 
        &pclsObj, &uReturn);
    if(0 == uReturn)
    {
        break;
    }
    VARIANT vtProp;

    // Get the value of the Name property
    hres = pclsObj->Get(atrb, 0, &vtProp, 0, 0);

    intVal=vtProp.uintVal;
 }
return intVal;
 }

程序正常执行,值可以轻松读取,但我对这个值有疑问。 我需要在网络适配器上每秒接收数据包。 有什么简单的解决办法吗?如果在 Qt 框架中,将不胜感激。

【问题讨论】:

  • 我看不到 intVal 的初始化位置,如果它是成员变量,您可能会遇到返回的先前值或返回未初始化内存的值。在您的代码中,您应该处理 Get 操作失败,无论是来自未知属性名称还是其他失败;如果失败,你应该返回一个错误值或抛出异常。

标签: c++ qt networking wmi


【解决方案1】:

确保您正确初始化 intVal:

int WMIClass::ExcuteQuery(const char* cstr,LPWSTR atrb) {
    int intVal = 0;

    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t(cstr),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);

    while (pEnumerator) {
        hres = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);

        if(0 == uReturn)
            break;

        VARIANT vtProp;

        // Get the value of the Name property
        hres = pclsObj->Get(atrb, 0, &vtProp, 0, 0);

        intVal = vtProp.uintVal;
    }

    return intVal;
}

【讨论】:

  • 仍然在那个范围内我得到了这些值 PacketReceived/Sec=4453164 PacketReceived/Sec=4453444 PacketReceived/Sec=4453724 PacketReceived/Sec=4454004 PacketReceived/Sec=4453164 PacketReceived/Sec=4453444 PacketReceived/Sec=4453724 PacketReceived/Sec=4454004
  • 我认为,这是 BytesReceived/Sec 值。
【解决方案2】:

Win32_PerfRawData 返回原始计数器值,因此实际上不是“每秒”。 您需要使用 Win32_PerfFormattedData 值来获得它。

【讨论】:

  • 欢迎来到 Stackoverflow @X-trade,有关您的答案的更多信息,例如指向参考资料可能是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2023-01-19
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多