首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetPerTcpConnectionEStats失败,无法多次获得GetPerTcpConnectionEStats,c++

SetPerTcpConnectionEStats失败,无法多次获得GetPerTcpConnectionEStats,c++
EN

Stack Overflow用户
提问于 2019-10-12 13:32:11
回答 1查看 222关注 0票数 0

我正在学习https://learn.microsoft.com/en-gb/windows/win32/api/iphlpapi/nf-iphlpapi-getpertcp6connectionestats?redirectedfrom=MSDN中的示例,以获取TCP统计数据。尽管我一开始就让它正常工作并获得统计数据,但我仍然希望每隔一段时间记录一次(我还没有做到这一点),我有以下问题。

  1. SetPerTcpConnectionEStats ()失败,状态为!= NO_ERROR,等于5。尽管失败,但我可以获得统计数据。为什么?,

  1. ,我想每隔1秒得到统计数据。我尝试了两种不同的方法:( a)使用ways循环并使用std::this_thread::sleep_for(1s),在这里我可以每1秒获得统计数据,但是整个应用程序都在拖延(因为这是因为这个原因),我假设我阻塞了主程序的操作,而(因为a)失败了),我试图从另一个函数(在不同的类中)调用TcpStatistics(在不同的类中),该函数每1秒触发一次(我将clientConnectRow存储到一个全局变量)。但是,在这种情况下(b),GetPerTcpConnectionEStats()在winStatus = 1214 (ERROR_INVALID_NETNAME)中失败,当然TcpStatistics()无法获得任何统计数据。

a)

代码语言:javascript
复制
ClassB::ClassB()
{
   UINT winStatus = GetTcpRow(localPort, hostPort, MIB_TCP_STATE_ESTAB, (PMIB_TCPROW)clientConnectRow);  
   ToggleAllEstats(clientConnectRow, TRUE);
   thread t1(&ClassB::TcpStatistics, this, clientConnectRow); 
   t1.join();
}

ClassB::TcpStatistics()
{
   while (true)
  {
     GetAndOutputEstats(row, TcpConnectionEstatsBandwidth)
     // some more code here
     this_thread::sleep_for(milliseconds(1000));
  }
}

b)

代码语言:javascript
复制
ClassB::ClassB()
{
    MIB_TCPROW client4ConnectRow;
    void* clientConnectRow = NULL;
    clientConnectRow = &client4ConnectRow;
    UINT winStatus = GetTcpRow(localPort, hostPort, MIB_TCP_STATE_ESTAB, (PMIB_TCPROW)clientConnectRow);    
    m_clientConnectRow = clientConnectRow;
    TcpStatistics();
}

ClassB::TcpStatistics()
{
  ToggleAllEstats(m_clientConnectRow , TRUE);
  void* row = m_clientConnectRow;
  GetAndOutputEstats(row, TcpConnectionEstatsBandwidth)
  // some more code here
}

ClassB::GetAndOutputEstats(void* row, TCP_ESTATS_TYPE type)
{
   //...
    winStatus = GetPerTcpConnectionEStats((PMIB_TCPROW)row, type, NULL, 0, 0, ros, 0, rosSize, rod, 0, rodSize);

    if (winStatus != NO_ERROR) {wprintf(L"\nGetPerTcpConnectionEStats %s failed. status = %d",  estatsTypeNames[type], winStatus); // 
    }
    else { ...}
}

ClassA::FunA()
{
  classB_ptr->TcpStatistics();
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-12 18:53:02

我为我问题的第二部分找到了一份工作。我把它张贴在这里,以防其他人发现它有用。也许还有其他的解决方案,更先进,但这是我自己做的。我们必须首先获得与TCP连接相对应的MIB_TCPROW,然后在转储当前状态之前启用Estats收集。所以,我所做的就是把所有这些都添加到一个函数中,然后调用它,每次我想要得到统计数据时。

代码语言:javascript
复制
void
ClassB::FunSetTcpStats()
{
    MIB_TCPROW client4ConnectRow;
    void* clientConnectRow = NULL;
    clientConnectRow = &client4ConnectRow;

    //this is for the statistics
    UINT winStatus = GetTcpRow(lPort, hPort, MIB_TCP_STATE_ESTAB, (PMIB_TCPROW)clientConnectRow); //lPort & hPort in htons!
    if (winStatus != ERROR_SUCCESS) {
        wprintf(L"\nGetTcpRow failed on the client established connection with %d", winStatus);
        return;
    }   
    //
    // Enable Estats collection and dump current stats.
    //
    ToggleAllEstats(clientConnectRow, TRUE);
    TcpStatistics(clientConnectRow); // same as GetAllEstats() in msdn
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58354687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档