如何取得网络连接的上下行数据量,速度等信息
跟windows的“连接状态”对话框中的内容一致,如连接状态,持续时间,速度,发送数据包,接收数据包数 问题点数:20、回复次数:4Top
1 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-15 10:49:06 得分 15
int CStatFluxDlg::NewWork()
{
DWORD dwIndex;
DWORD dwNumber;
DWORD dwResult;
ULONG OutBufLen;
IP_ADAPTER_INFO AdapterInfo;
PIP_ADDR_STRING pAddrString;
PIP_ADAPTER_INFO pAdapterNext;
MIB_IFROW IfRow;
OutBufLen = sizeof(IP_ADAPTER_INFO);
dwResult = GetAdaptersInfo(&AdapterInfo,&OutBufLen);
if(dwResult == ERROR_BUFFER_OVERFLOW)
{
GetAdaptersInfo(&AdapterInfo,&OutBufLen);
}
else if (dwResult != ERROR_SUCCESS)
{
printf("GetAdaptersInfo Error: %d\n",GetLastError());
return FALSE;
}
printf("\t\t=== Network Interface ===\n\n");
pAdapterNext = &AdapterInfo;
while(pAdapterNext != NULL)
{
printf("AdapterName:\t %s\n",pAdapterNext->AdapterName);
printf("Description:\t %s\n",pAdapterNext->Description);
dwIndex = pAdapterNext->Index;
printf("Address:\t ");
for(dwNumber = 0;dwNumber < pAdapterNext->AddressLength - 1; dwNumber++)
{
printf("%.2X-",pAdapterNext->Address[dwNumber]);
}
printf("%.2X\n",pAdapterNext->Address[dwNumber]);
printf("Type:\t\t ");
switch(pAdapterNext->Type)
{
case MIB_IF_TYPE_OTHER:
printf("Other\n");
break;
case MIB_IF_TYPE_ETHERNET:
printf("Ethernet\n");
break;
case MIB_IF_TYPE_FDDI:
printf("FDDI\n");
break;
case MIB_IF_TYPE_PPP:
printf("PPP\n");
break;
case MIB_IF_TYPE_LOOPBACK:
printf("LoopBack\n");
break;
case MIB_IF_TYPE_SLIP:
printf("Slip\n");
break;
default:
printf("\n");
break;
}
printf("IpAddressList:\t %s\t\t%s\n","IP Address","Subnet Mask");
pAddrString = &pAdapterNext->IpAddressList;
while(pAddrString != NULL)
{
printf("\t\t %-15s\t",pAddrString->IpAddress.String);
printf("%s\n",pAddrString->IpMask.String);
pAddrString = pAddrString->Next;
}
pAddrString = &pAdapterNext->GatewayList;
printf("GatewayList:\t %s\n",pAddrString->IpAddress.String);
pAddrString = pAddrString->Next;
while(pAddrString != NULL)
{
printf("\t\t %s\n",pAddrString->IpAddress.String);
pAddrString = pAddrString->Next;
}
if(pAdapterNext->DhcpEnabled != 0)
{
printf("DhcpServer:\t %s\n",pAdapterNext->DhcpServer.IpAddress.String);
pAddrString = pAdapterNext->DhcpServer.Next;
while(pAddrString != NULL)
{
printf("\t\t\t %s\n",pAddrString->IpAddress);
pAddrString = pAddrString->Next;
}
}
if(pAdapterNext->HaveWins != 0)
{
printf("PrimaryWinsSvr: %s\n",pAdapterNext->PrimaryWinsServer);
printf("SecondaryWinsSvr: %s\n",pAdapterNext->SecondaryWinsServer);
}
printf("LeaseObtained:\t %s",asctime(gmtime(&pAdapterNext->LeaseObtained)));
printf("LeaseExpires:\t %s\n",asctime(gmtime(&pAdapterNext->LeaseExpires)));
IfRow.dwIndex = dwIndex;
if((dwResult = GetIfEntry(&IfRow)) != NO_ERROR)
{
printf("GetIfEntry Error: %d\n",dwResult);
break;
}
printf("MTU:\t\t %d\n",IfRow.dwMtu);
printf("Speed:\t\t %d Kbps\n",IfRow.dwSpeed/1000);
printf("OperStatus:\t ");
switch(IfRow.dwOperStatus)
{
case MIB_IF_OPER_STATUS_NON_OPERATIONAL:
printf("LAN Adapter Disabled\n");
break;
case MIB_IF_OPER_STATUS_UNREACHABLE:
printf("WAN Adapter Disconnected\n");
break;
case MIB_IF_OPER_STATUS_DISCONNECTED:
printf("LAN Adapters Disconnected or WAN Adapters no Carrier\n");
break;
case MIB_IF_OPER_STATUS_CONNECTING:
printf("WAN Adapter Connecting\n");
break;
case MIB_IF_OPER_STATUS_CONNECTED:
printf("WAN Adapter Connected\n");
break;
case MIB_IF_OPER_STATUS_OPERATIONAL:
printf("LAN Adapter Default Status\n");
break;
default:
printf("\n");
break;
}
printf("Unknown Protocol: %d\n\n",IfRow.dwInUnknownProtos);
printf("\t%12s%12s%10s\t%s\n","Unicast","NUnicast","Error","Bytes");
printf("%s\t%12d%12d%10d\t%d\n","Send:",IfRow.dwOutUcastPkts,IfRow.dwOutNUcastPkts,IfRow.dwOutErrors,IfRow.dwOutOctets);
printf("%s%12d%12d%10d\t%d\n","Receive:",IfRow.dwInUcastPkts,IfRow.dwInNUcastPkts,IfRow.dwInErrors,IfRow.dwInOctets);
printf("%s\t%12d%12d%10d\t%d\n","Total:",
IfRow.dwInUcastPkts + IfRow.dwOutUcastPkts,
IfRow.dwInNUcastPkts + IfRow.dwOutNUcastPkts,
IfRow.dwInErrors + IfRow.dwOutErrors,
IfRow.dwInOctets + IfRow.dwOutOctets);
pAdapterNext = pAdapterNext->Next;
}
return TRUE;
}
Top
2 楼WinEggDrop(WinEggDrop)回复于 2006-03-16 07:30:19 得分 5
有上面的数据,是可以得到数据,但是,象windows的连接接状态那里一样,如果流量超过一定量,看到的数据就会错误.你可以看上面的代码中的MIB_IFROW结构,基本都是DWORD类型,也就是说数据的记录超不过DWORD的最大上限,超过了,就会复位为0.我也测试过,事实上也真是这样.Top
3 楼gohappy_1999(碧水蓝天)回复于 2006-03-16 08:43:04 得分 0
gzTop
4 楼binlyb007(滚来滚去)回复于 2006-03-16 20:24:53 得分 0
我的项目中DWORD应该够用了,既然没人继续发表看法,就揭帖吧,就谢谢大家的关注Top




