bRet = ::GetIfTable( pIf, &dwIfBufSize, TRUE ); if ( bRet == ERROR_INSUFFICIENT_BUFFER ) { if( pIf != NULL ) delete[] pIf; pIf = ( MIB_IFTABLE * ) new char[dwIfBufSize]; bRet = ::GetIfTable( pIf, &dwIfBufSize, TRUE ); } ......................... 1. rfc1213中这样解释IfSpeed: "An estimate of the interface's current bandwidth in bits per second. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth."
所以说明该接口的速率(带宽)是恒定值,标称带宽2Gbps.(光纤?)
5. 对于接口自己本身来说,当前速率是无意的。只有一个统计平均值。如bits per second。 你要想显示“当前速率”,可以每1秒或几秒取一次in/out octets的值, 两次的差值除以时间间隔得出。注意,如果后一次取得的值小于前一次,说明dword已经超出表示范围过,得把后一次作一下处理再用。
GetIfTable() 是取本机所有接口的信息。
调用了后者当然不用再调用前者了。
一般地,不考虑速度,调用这种需要未知缓冲区大小的函数是这样作的:
例如:
PMIB_IFTABLE pIf = NULL;
DWORD dwIfBufSize = 0;
BOOL bRet;
bRet = ::GetIfTable( pIf, &dwIfBufSize, TRUE );
if ( bRet == ERROR_INSUFFICIENT_BUFFER )
{
if( pIf != NULL )
delete[] pIf;
pIf = ( MIB_IFTABLE * ) new char[dwIfBufSize];
bRet = ::GetIfTable( pIf, &dwIfBufSize, TRUE );
}
.........................
1. rfc1213中这样解释IfSpeed:
"An estimate of the interface's current bandwidth in bits per second. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain
the nominal bandwidth."
所以说明该接口的速率(带宽)是恒定值,标称带宽2Gbps.(光纤?)
5. 对于接口自己本身来说,当前速率是无意的。只有一个统计平均值。如bits per second。 你要想显示“当前速率”,可以每1秒或几秒取一次in/out octets的值, 两次的差值除以时间间隔得出。注意,如果后一次取得的值小于前一次,说明dword已经超出表示范围过,得把后一次作一下处理再用。
MIB_IFROW结构下的dwSpeed可以得到速率,但是网络断开情况下,仍然可以获取,难道自适应网卡不是根据服务器/对方的网络状况,协商选定当前速率?都是取100Mbps作为自适应网卡的恒定速率?
既然是由IC控制,那驱动程序没有提供这个查询功能(一般是ioctl()函数进行IC的寄存器操作。),那我们无法得知他的自适的结果是什么,即时10 mbps, 100 mbps, 或者1000 mbps.