我也查过网络上的一些文章,有些是以“收到数据包”的数量来计算带宽的,但是现在带来一个问题:拨号网络建立了,但是没有进行数据传输,那么按照这个办法算出来的带宽是不是就是0或者很低?而实际上此时网络状况良好带宽很宽?请教各位高手:如何实时检测拨号连接的带宽,不受实际收发数据包数量的影响。

解决方案 »

  1.   

    先用GetInterfaceInfo获取所有适配器列表(其中包括拨号网络)
    在针对每个适配器,用GetIfEntry获得每个适配器的详细信息
    这2个函数是iphlpapi中的函数,需要在代码前面包含头文件,并指明链接库文件
    #include <iphlpapi.h>
    #pragma comment(lib, "iphlpapi.lib")下面是我以前写过的部分代码:
    DWORD dwSize = 0;
    GetInterfaceInfo(NULL, &dwSize);
    if (dwSize <= 0) return;
    PIP_INTERFACE_INFO pIfTable = (PIP_INTERFACE_INFO)malloc(dwSize);
    if (!pIfTable)
    return;
    if (GetInterfaceInfo(pIfTable, &dwSize) != NO_ERROR)
    {
    free(pIfTable);
    return;
    }
    for (int i = 0; i < (int)pIfTable->NumAdapters; i++)
    {
    MIB_IFROW IfRow;
    IfRow.dwIndex = pIfTable->Adapter[i].Index;
    if (GetIfEntry(&IfRow) == NO_ERROR)
    {
    //在这里可以判断IfRow中的dwType,MIB_IF_TYPE_PPP是拨号
    //ifRow.dwSpeed就是速率
    }
    } free(pIfTable);
      

  2.   

    如果想检测本机网络接口当前的利用率,可以使用iphlpapi中提供的IP助手函数GetIfTable(), 可获取本机所有接口的标准带宽及当前已发送/接收的字节数, 单位时间内的发送/接收字节数之合即可认为是当前使用的网络带宽, 与前者相减可以得到当前闲置带宽。如果是想检测路由器/交换机/服务器的当前网络接口使用情况,可利用SNMP协议命令获取。
    条件,目标支持SNMP协议,且你对其拥有至少可读权限
      

  3.   

    用IpHelper系列函数获得网络参数,然后自己计算,获得当前网络利用率
      

  4.   

    对于路由器等,可以用SNMP协议,查找相应的oid,至于权限,现在的一般对于基本的查询还是允许的,community为public
      

  5.   

    想不出来啊。
    不过SNMP也只是一种算法上的估计吧。
    要算当前带宽,有能在这上面流数据,那怎么算法啊。
    再关注。
      

  6.   

    拨号后,获得的连接带宽,是双方modem(对方可能是isp的modem池)协商后确定的。一旦连接建立后,这个值不会改变。
    实际的2个modem之间的带宽变化,情况可能很复杂,有可能是线路质量、干扰信号等等造成的,再没有数据传输时,你根本无法确定。
    对方modem和internet(如果是拨入isp)上的某个地址之间的实际带宽,情况就更复杂了,可能是某个路由器负载过高、也许是你的邻居在下载电影
      

  7.   

    to iq199(iq199) :确实就是这个情况,现在只能获取建立连接时所约定的带宽,实际中的变化就不知道,晕