Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 279, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

PDA/PPC下如何获取GPRS的网络流量

PDA/PPC设备上,GPRS上网的途径有两种:通过Modem拨号和通过WI-FI无线上网,前者一般用在PDA/PPC和电脑间的,使用数据线、红外线、蓝牙等连接途径与电脑相连,拨号上网;
通过WI-FI无线上网则是手机直接上网。在PDA/PPC下,网络流量的统计和其他WINDOWS平台并没有太大区别,最简单的方法就是通过微软的IPHELPER API,其他的方法有通过NDISUIO
用CreateFile打开"UIO0:",,DeviceIoControl实现对网卡的枚举,绑定等工作或是用SPI等应用层(使用SPI在Windows CE/Mobile上实现网络防火墙的例子代码)。
int GetTraffic(void)
{
 
 DWORD dwSize = 0;
 DWORD dwRetVal = 0;

 int i = 0;
 int j = 0;

 /* variables used for GetIfTable and GetIfEntry */
 MIB_IFTABLE *pIfTable;
 MIB_IFROW *pIfRow;

 // Allocate memory for our pointers.
 pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
 if (pIfTable == NULL)
 {
  return 0;
 }
 // Make an initial call to GetIfTable to get the
 // necessary size into dwSize
 dwSize = sizeof (MIB_IFTABLE);
 if (GetIfTable(pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
 {
  FREE(pIfTable);
  pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
  if (pIfTable == NULL)
  {
   return 0;
  }
 }

 // Make a second call to GetIfTable to get the actual
 // data we want.
 if ((dwRetVal = GetIfTable(pIfTable, &dwSize, FALSE)) == NO_ERROR)
 {
  for (i = 0; i < (int) pIfTable->dwNumEntries; i++)
  {
   pIfRow = (MIB_IFROW *) & pIfTable->table[i];

   if ((pIfRow->dwType == IF_TYPE_ETHERNET_CSMACD) || (pIfRow->dwType == IF_TYPE_PPP))//以太网
   {
    m_lConnection = TRUE;
    //////////////////////////////////////////////////////////////////////////
    if (strstr(Descr,"cmwap") || strstr(Descr,"cmnet"))//接入点是cmwap
    {
     {
      sprintf(m_sNowTraffic,"%1.2f",pIfRow->dwInOctets / 1024.0);//现在的流量
      m_bReturn = TRUE;
     }
    }
    if (pIfTable != NULL)
    {
     FREE(pIfTable);
     pIfTable = NULL;
    }
   }
  }
 }
 else
 {
  if (pIfTable != NULL)
  {
   FREE(pIfTable);
   pIfTable = NULL;
  } 
  return 0;
  // Here you can use FormatMessage to find out why
  // it failed.
 }
 if (pIfTable != NULL)
 {
  FREE(pIfTable);
  pIfTable = NULL;
 }
}
要注意的是pIfRow->dwInOctets获得是当前的流量,也是本次连接的总流量,不用累加的;当从其他非GPRS连接转过来时,流量要加上上次流量才是总流量;这里统计的是通过WI-FI和MODEM方式的GPRS总的流量,当然也可以分开统计。

posted on 2009-02-05 18:31 Benjamin 阅读(699) 评论(2)  编辑 收藏 引用 所属分类: PDA/PPC开发

评论

# re: PDA/PPC下如何获取GPRS的网络流量  回复  更多评论   

请问下Descr这个值,也就是接入点是通过什么API来获取的?
2009-06-11 15:08 | liaoxh

# re: PDA/PPC下如何获取GPRS的网络流量  回复  更多评论   

Descr是个字符串。
在pIfRow = (MIB_IFROW *) & pIfTable->table[i];加上memcpy(Descr,pIfRow->bDescr,pIfTable->dwNumEntries)来获取
2009-06-11 21:17 | Benjamin

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理