天天看點

【轉】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;

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

繼續閱讀