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總的流量,當然也可以分開統計。