GetIfTable网卡带¥宽,统计流¥量

/我们可以使用Iphlpapi函数来制作自己的Ipconfig程序、Arp程序或者别的程序。

在第二章第二节介绍了GetIfTable函数,通过这个函数可以获得总共收到和发出的数据字节数等信息。比较前后两次总共收到与发出的数据大小以及之间的时间,就可以获得当前网络传输数据的速率。


#include <windows.h>

#include <iphlpapi.h>
#include <stdio.h>


#pragma comment ( lib, "iphlpapi.lib" )






int main(void)
{
MIB_IFTABLE   *pIfTable = NULL;
ULONG          dwSize = 0;


DWORD          dwRet;


printf("This program try to get the speed of a modem by using GetIfTable()\n");


dwRet = GetIfTable(pIfTable, &dwSize, TRUE);
if (dwRet == ERROR_INSUFFICIENT_BUFFER)
{
pIfTable = (MIB_IFTABLE *) new char[dwSize];


if (pIfTable != NULL)
{
dwRet = GetIfTable(pIfTable, &dwSize, TRUE);
if (dwRet == NO_ERROR)
{
printf("dwNumEntries = %u\n", pIfTable->dwNumEntries);


for (int i = 0; i<pIfTable->dwNumEntries; i++)
{
if ((pIfTable->table[i]).dwType == MIB_IF_TYPE_ETHERNET && (pIfTable->table[i]).dwAdminStatus == 1 && ((pIfTable->table[i]).dwPhysAddrLen == 6) && ((pIfTable->table[i].dwOperStatus) == MIB_IF_OPER_STATUS_OPERATIONAL))//MIB_IF_TYPE_ETHERNET ->以太网
{




printf("table[%1d].dwIndex = %u\n",i,(pIfTable->table[i]).dwIndex);
printf("        dwType  = %u\n",(pIfTable->table[i]).dwType);
printf("         dwSpeed = %u\n",(pIfTable->table[i]).dwSpeed);
}
}
}

else
{
printf("Some error occured!\n");
}
}
else
{
printf("Memory allocate failue\n");
}
}
else
{
printf("Some error occured!\n");
}

system("pause");
return 0;

}



GetIfTable 统计流量怎么不准,哪里出错了?


int inCount = 0;
int outCount = 0;

if ((dwRetVal = GetIfTable(pIfTable, &dwSize, FALSE)) == NO_ERROR)
{
for (int i = 0; i < pIfTable->dwNumEntries; i++)
{
pIfRow = (MIB_IFROW *)& pIfTable->table[i];

if ((pIfRow->dwPhysAddrLen == 6) && (pIfRow->dwType == MIB_IF_TYPE_ETHERNET))
{
inCount += pIfRow->dwInOctets;
outCount += pIfRow->dwOutOctets;
}
}
}

if (m_inCount == -1)
{
m_inCount = inCount;
m_outCount = outCount;
}
else
{
int intmp = inCount - m_inCount;
int outtmp = outCount - m_outCount;
m_inCount = inCount;
m_outCount = outCount;
printf(("in:%d kb//s    out:%d kb//s\n"), intmp / 1024, outtmp / 1024);
}


每1秒会调用这个函数一次,统计出来的和360的差很多。 
我进行上传和下载,明显统计的数据就是大很多。
------解决思路----------------------
对比一下数据,再分析是数据获取 不对还是计算有问题

要获取网络实际使用率,可以使用系统提供的网络统计信息。在 C/C++ 中,可以通过调用系统 API 来获取这些信息。 在 Windows 操作系统中,可以使用 GetIfTable 和 GetIfEntry 函数来获取网络接口的统计信息。可以使用这些函数计算网络实际使用率。 在 Linux 操作系统中,可以使用 /proc/net/dev 文件来获取网络接口的统计信息。可以读取该文件并计算网络实际使用率。 以下是一个简单的 C++ 代码片段,用于获取 Windows 操作系统中网络接口的统计信息并计算网络实际使用率: ```cpp #include <Windows.h> #include <iphlpapi.h> #include <iostream> #pragma comment(lib, "iphlpapi.lib") int main() { MIB_IFTABLE* ifTable = nullptr; DWORD ifTableSize = 0; // 获取网络接口表格大小 GetIfTable(ifTable, &ifTableSize, false); // 分配缓冲区,获取网络接口表格 ifTable = (MIB_IFTABLE*) new char[ifTableSize]; GetIfTable(ifTable, &ifTableSize, false); // 遍历网络接口,输出实际使用率 for (DWORD i = 0; i < ifTable->dwNumEntries; ++i) { auto& ifEntry = ifTable->table[i]; // 计算网络实际使用率 ULONGLONG bytesSent = ifEntry.dwOutOctets; ULONGLONG bytesReceived = ifEntry.dwInOctets; ULONGLONG bytesTotal = bytesSent + bytesReceived; double utilization = bytesTotal / (double)ifEntry.dwSpeed; std::cout << "Interface: " << ifEntry.wszName << std::endl; std::cout << "Utilization: " << utilization << std::endl; } delete[] ifTable; return 0; } ``` 注意,上述代码仅适用于 Windows 操作系统。在 Linux 操作系统中,需要使用相应的 API 或文件来获取网络统计信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值